BeautifulSoup собирает объекты div в некоторых запросах на загрузку, но не в других - PullRequest
1 голос
/ 09 октября 2019

Я использую модуль Python bs4 для разбора HTML. Однако я столкнулся со странной ошибкой.

При загрузке HTML-страниц страниц для анализа я заметил, что BS4 распознает объекты div на некоторых страницах, но не на других, даже если конкретный объект, на который я ссылаюсь,присутствует в обоих, и пути одинаковы.

например,

<div class = "item" data-year = "19-20">
     <div class = "irrelevant">...</div>
     <div class = "irrelevant">...</div>
     <div class = "stats-grids">...</div>
     <div class = "irrelevant">...</div>
</div>

Я немного покопался и часто вижу, что нечто подобное может быть вызвано использованием Java на веб-странице, а не отображением в HTML. Однако я считаю, что это не так в этом случае, потому что BS4 правильно идентифицирует путь в других случаях, когда код остается неизменным.

При использовании ...

res = requests.get('examplesite.com')
soup = bs4.BeautifulSoup(res.text, 'html.parser')

element = soup.select('div[data-year = "19-20"] > div[class = "stats-grids"]')

На некоторых страницах того же веб-сайта элемент указан правильно. В других случаях он может находить div [data-year = "19-20"] и div [class = "stats-grids"] независимо друг от друга, но не тогда, когда я указываю, что один является потомком другого.

Другими словами, он есть, но только если я укажу, что таблицы статистики находятся в пределах года данных, он не отображается.

1 Ответ

1 голос
/ 09 октября 2019

Это может произойти из-за неправильного HTML-кода сайта (например, тег не закрыт).

Попробуйте использовать html5lib . Он попытается создать правильно сформированный HTML-документ, добавив дополнительные теги.

Установите его, используя

pip install html5lib

и укажите его в конструкторе BeautifulSoup

soup = bs4.BeautifulSoup(res.text, 'html5lib')

Ссылка: Различия между анализаторами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...