Соскреб в сети с BeautifulSoup возвращает NoneType - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь очистить сайт с помощью BeautifulSoup и написал следующий код:

import requests
from bs4 import BeautifulSoup

page = requests.get("https://gematsu.com/tag/media-create-sales")
soup = BeautifulSoup(page.text, 'html.parser')

try:
    content = soup.find('div', id='main')
    print (content)
except:
    print ("Exception")

Однако, это возвращает NoneType, даже если div существует с правильным идентификатором на веб-сайте. Что-то я делаю не так?

Я вижу div с идентификатором main на странице:

enter image description here

Я также нахожу div main при печати soup:

enter image description here

1 Ответ

0 голосов
/ 18 января 2019

Это кратко описано в документации BeautifulSoup

Beautiful Soup предоставляет один и тот же интерфейс множеству различных анализаторов, но каждый анализатор отличается. Различные парсеры будут создавать разные деревья разбора из одного и того же документа. Самые большие различия между парсерами HTML и парсерами XML

[...]

Вот тот же документ, проанализированный с помощью встроенного в Python HTML-парсера:

BeautifulSoup("<a></p>", "html.parser")

Как и html5lib, этот анализатор игнорирует закрывающий тег </p>. В отличие от html5lib, этот анализатор не пытается создать правильно сформированный HTML-документ путем добавления тега. В отличие от lxml, он даже не удосуживается добавить тег.

Вероятно, возникла проблема из-за искаженного HTML, который html.parser не может обработать надлежащим образом. Это привело к удалению id="main", когда BeautifulSoup проанализировал HTML. Изменяя синтаксический анализатор на html5lib или lxml, BeautifulSoup обрабатывает искаженный HTML иначе, чем html.parser

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