Форум сайта python.su
Доброго времени суток! Обнаружил странную особенность библиотеки requests. Заметил это случайно, когда делал для собственного образования парсер сайта avito с помощью библиотеки bs4. Ниже приведу скриншот. На первом скрине (белый фон) часть странички avito, где выделено два тега <p></p>. Библиотека requests читает эти теги странным образом, выкидывая первый открывающий тэг. Это есть на фтором скриншоте. А далее ошибка тянется в bs4 с соответствующими последствиями.
Отредактировано freeman86 (Дек. 2, 2019 10:07:13)
Прикреплённый файлы:
пример4.jpg (106,2 KБ)
Офлайн
freeman86
Предположу, что requests как раз отдает всё правильно, как и было задумано. Не её задача ковыряться в HTML. Именно так страницу и сверстал её автор. Просто браузер не смог распарсить (ну потому что тут явная ошибка) и попытался ошибку исправить (ковыряться в HTML как раз задача браузера).
Офлайн
Там на фото в бразузере есть “== $0”, а в данных нет этой подстроки. Уверен, что это один и тот же фрагмент изображён?
Офлайн
py.user.nextАбсолютно уверен. Более того, есть третий вариант этой верстки, если смотреть исходный код, который получает браузер. И там тег <p></p> вовсе не пустой. А так, вы сами можете найти это фрагмент на Авито. Забиваете в поисковой строке любой товар, нажимаете поиск и все товары, которые появятся, будут состоять из блоков. Тот фрагмент, который я показываю, содержит информацию о метро и как давно создано объявление.
Там на фото в бразузере есть “== $0”, а в данных нет этой подстроки. Уверен, что это один и тот же фрагмент изображён?
Отредактировано freeman86 (Дек. 4, 2019 09:38:52)
Прикреплённый файлы:
html.jpg (83,0 KБ)
Офлайн
requests ничегоне добавляет и не убирает, в отличие от браузера, так свёрстана страница, добро пожаловать в мир рукожопых веб-макак. Попробуй пропустить через lxml, он может исправить эту ситуацию (раз bs не может, и посмотри ещё сам bs, возможно ему можно вкл. дополнительные мозги). Можно так же html5lib посмотреть, он должен быть максимально точным, но медленным. Если скорость не нужна, бери сразу его.
Про третий вариант: знаешь что такое JS?
..bw
Офлайн
bwХотите сказать что они генерируются после того, как requests уже считала страницу?
requests ничегоне добавляет и не убирает, в отличие от браузера, так свёрстана страница, добро пожаловать в мир рукожопых веб-макак. Попробуй пропустить через lxml, он может исправить эту ситуацию (раз bs не может, и посмотри ещё сам bs, возможно ему можно вкл. дополнительные мозги). Можно так же html5lib посмотреть, он должен быть максимально точным, но медленным. Если скорость не нужна, бери сразу его.Про третий вариант: знаешь что такое JS?..bw
Офлайн
freeman86веб-сервер получает запрос и отправляет какой-то ответ. Ответом может быть любой текст. Вот этот текст и получает requests. Этой библиотеке вообще плевать на содержимое. Браузер же работает с HTML и воспринимает собержимое ответа как HTML. После загрузки браузер парсит HTML в DOM и дальше с ним работает. В HTML может быть встроен JS-скрипт, который браузер выполнит после загрузки страницы и соответствующим образом изменит DOM. То что вы видите в отладчике браузера может вовсе не соответствовать тому тексту, который отправил веб-сервер.
Хотите сказать что они генерируются после того, как requests уже считала страницу?
Офлайн