Содержимое тега BeautifulSoup4 не отображается

#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>
  

Содержимое тега 'title' из первого примера

К сожалению, во втором случае поиск заголовка таким же образом возвращает содержимое только с 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>
  

Содержимое тега 'title' из второго примера

Я упускаю что-то очевидное, что сделало бы получение строки из заголовка и следующего диапазона согласованным в обоих случаях?

Редактировать: я обнаружил, что проблема где-то в разборе 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') ).