Почему find_all не может найти элемент `div`, который явно присутствует? - PullRequest
0 голосов
/ 09 февраля 2019

Я хочу найти текст, связанный с элементом div, с веб-страницы, проанализированной с beautifulsoup.

print(searchResult)

<div id="results-from-CIDR"><a href="javascript:prefixContribsToggleAll();" id="prefixcontribs-tog">toggle all</a><span id="prefixcontribs-prog">Searching.</span> No changes were found for this wildcard/CIDR range.</div>

print(type(searchResult))

<class 'bs4.element.Tag'>

print(searchResult.find_all("div"))

[]

print(searchResult.find_all("div", attrs={"id":"results-from-CIDR"}))

[]

Там явно есть разделение.Почему это не находит это?

1 Ответ

0 голосов
/ 09 февраля 2019

Если вы просто ищете обычный / видимый текст div без какой-либо разметки, вы можете получить доступ к этому тексту через атрибут searchResult.text.

Метод Tag.find_all() ищет только потомки из Tag, чей name соответствует данному аргументу.Так что в вашем случае он возвращает пустой список, потому что нет потомка <divs>.Единственными потомками примера Tag, которым вы поделились, являются тег <a>, <span> и несколько экземпляров NavigableString (объект bs4, используемый для представления видимого текста в дереве DOM).Если вы хотите использовать find_all() для возврата <div> в вашем примере, вам придется вызывать его из родительского Tag (или, скорее, из любого элемента, потомком которого является цель <div>).

Например, если вы сделаете:

from bs4 import BeautifulSoup as Soup
soup = Soup('<html><body><div id="results-from-CIDR"><a href="javascript:prefixContribsToggleAll();" id="prefixcontribs-tog">toggle all</a><span id="prefixcontribs-prog">Searching.</span> No changes were found for this wildcard/CIDR range.</div></body></html>')
soup.findall('div') 

... тогда будет возвращен элемент , поскольку он является потомком soup (htmldocroot).

Но опять же, если вы просто пытаетесь извлечь текст, используйте атрибут .text, который дает видимый текст для данного тега и любого из его потомков.

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