#html #python-3.x #beautifulsoup
#HTML #python-3.x #beautifulsoup
Вопрос:
Я пытаюсь очистить некоторые данные с веб-сайта и обнаружил случай, когда BeautifulSoup4 не отображает весь контент, как я ожидал. В первом примере ниже все работает нормально. После нахождения тега с классом «title» он показывает, что в содержимом есть два элемента (NavigableText: Сумка для хранения и тег Span).
<h1 class="title">
Bag of Holding
<span style="float:right;">
Item 4
</span>
</h1>
К сожалению, во втором случае поиск заголовка таким же образом возвращает содержимое только с 1 элементом, где я ожидал бы, что их будет 3. Я ожидал бы, что содержимое будет содержать тег ‘a’, текст и диапазон, но, похоже, у него есть только тег ‘a’. Это действительно затрудняет доступ к NavigableText, поскольку он доступен только как ‘next’ элемент ‘img’.
<h1 class="title">
<a href="PFS.aspx">
<span style="float:left;">
<img alt="PFS Standard" title="PFS Standard" style="height:25px; padding:2px 10px 0px 2px" src="ImagesIconsPFS_Standard.png">
</span>
</a>
Adventurer's Pack
<span style="float:right;">
Item 0
</span>
</h1>
Я упускаю что-то очевидное, что сделало бы получение строки из заголовка и следующего диапазона согласованным в обоих случаях?
Редактировать: я обнаружил, что проблема где-то в разборе html-ответа, поскольку он изменяет ответ из 2-го примера на что-то вроде:
<h1 class="title">
<a href="PFS.aspx">
<span style="float:left;">
<img alt="PFS Standard" src="ImagesIconsPFS_Standard.png" style="height:25px; padding:2px 10px 0px 2px" title="PFS Standard"/>
</span>
</a>
</h1>
</span>
Adventurer's Pack
<span style="float:right;">
Item 0
</span>
Похоже, это вызвано возвращаемым HTML, поскольку даже в необработанном HTML похоже, что </a>
появляется раньше </span>
, что заставляет меня думать, что BeautifulSoup, увидев что-то подобное, автоматически закрыл тег, а при поиске next </span>
он также закрыл тег заголовка.
Ответ №1:
Действительно, проблема заключалась в неправильном ответе html. <a>
Тег был закрыт перед вложенным <span>
тегом, что привело к проблемам с default html.parser
. Я исправил это, используя html5lib
анализатор с BeautifulSoup ( BeautifulSoup(page.text, 'html5lib')
).