freeman86
Дек. 2, 2019 10:06:44
Доброго времени суток! Обнаружил странную особенность библиотеки requests. Заметил это случайно, когда делал для собственного образования парсер сайта avito с помощью библиотеки bs4. Ниже приведу скриншот. На первом скрине (белый фон) часть странички avito, где выделено два тега <p></p>. Библиотека requests читает эти теги странным образом, выкидывая первый открывающий тэг. Это есть на фтором скриншоте. А далее ошибка тянется в bs4 с соответствующими последствиями.
FishHook
Дек. 3, 2019 10:46:58
freeman86
Предположу, что requests как раз отдает всё правильно, как и было задумано. Не её задача ковыряться в HTML. Именно так страницу и сверстал её автор. Просто браузер не смог распарсить (ну потому что тут явная ошибка) и попытался ошибку исправить (ковыряться в HTML как раз задача браузера).
py.user.next
Дек. 4, 2019 01:58:14
Там на фото в бразузере есть “== $0”, а в данных нет этой подстроки. Уверен, что это один и тот же фрагмент изображён?
freeman86
Дек. 4, 2019 09:38:19
py.user.next
Там на фото в бразузере есть “== $0”, а в данных нет этой подстроки. Уверен, что это один и тот же фрагмент изображён?
Абсолютно уверен. Более того, есть третий вариант этой верстки, если смотреть исходный код, который получает браузер. И там тег <p></p> вовсе не пустой. А так, вы сами можете найти это фрагмент на Авито. Забиваете в поисковой строке любой товар, нажимаете поиск и все товары, которые появятся, будут состоять из блоков. Тот фрагмент, который я показываю, содержит информацию о метро и как давно создано объявление.
requests ничегоне добавляет и не убирает, в отличие от браузера, так свёрстана страница, добро пожаловать в мир рукожопых веб-макак. Попробуй пропустить через lxml, он может исправить эту ситуацию (раз bs не может, и посмотри ещё сам bs, возможно ему можно вкл. дополнительные мозги). Можно так же html5lib посмотреть, он должен быть максимально точным, но медленным. Если скорость не нужна, бери сразу его.
Про третий вариант: знаешь что такое JS?
..bw
freeman86
Дек. 6, 2019 10:16:29
bw
requests ничегоне добавляет и не убирает, в отличие от браузера, так свёрстана страница, добро пожаловать в мир рукожопых веб-макак. Попробуй пропустить через lxml, он может исправить эту ситуацию (раз bs не может, и посмотри ещё сам bs, возможно ему можно вкл. дополнительные мозги). Можно так же html5lib посмотреть, он должен быть максимально точным, но медленным. Если скорость не нужна, бери сразу его.Про третий вариант: знаешь что такое JS?..bw
Хотите сказать что они генерируются после того, как requests уже считала страницу?
FishHook
Дек. 6, 2019 15:45:44
freeman86
Хотите сказать что они генерируются после того, как requests уже считала страницу?
веб-сервер получает запрос и отправляет какой-то ответ. Ответом может быть любой текст. Вот этот текст и получает requests. Этой библиотеке вообще плевать на содержимое. Браузер же работает с HTML и воспринимает собержимое ответа как HTML. После загрузки браузер парсит HTML в DOM и дальше с ним работает. В HTML может быть встроен JS-скрипт, который браузер выполнит после загрузки страницы и соответствующим образом изменит DOM. То что вы видите в отладчике браузера может вовсе не соответствовать тому тексту, который отправил веб-сервер.