Есть ли способ получить итератор из bs4 findAll (), например, re.findIter ()? - PullRequest
0 голосов
/ 15 декабря 2018

Я не хочу, чтобы bs4 анализировал весь документ, но у меня также нет никакого способа использовать аргумент limit, поскольку я не знаю, сколько ссылок мне нужно было бы проанализировать заранее.Если бы это было re, я бы использовал re.finditer() в этой ситуации.Но я не смог найти подобную функцию в bs4.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Нет, BeautifulSoup не имеет аналогичной "итеративной / ленивой" версии find_all().

Одна вещь, которую вы можете сделать, не анализируя весь документ, это SoupStrainer, который, по крайней мере, позволил бы вам сосредоточиться BeautifulSoup на анализе только нужных элементов страницы.

0 голосов
/ 15 декабря 2018

Поскольку вы прокомментировали, что имеете дело с XML-документом, вы можете использовать ElementTree, элементы которого реализуют .iter (при условии, что вы используете Python> = 3.2):

import xml.etree.ElementTree as ET

doc = ['<root>'] + ['<a href="{}"/>' for i in range(10)] + ['</root>']
doc = ET.fromstring(''.join(doc))
print(doc.iter(tag='a'))
for link in doc.iter(tag='a'):
    print(link)

выходы

# <_elementtree._element_iterator object at 0x000001FFE8B44468>
# <Element 'a' at 0x000001FFD05253B8>
# <Element 'a' at 0x000001FFE8AF62C8>
# <Element 'a' at 0x000001FFE8B32B38>
# <Element 'a' at 0x000001FFE8B32B88>
# <Element 'a' at 0x000001FFE8B41228>
# <Element 'a' at 0x000001FFE8B451D8>
# <Element 'a' at 0x000001FFE8B45228>
# <Element 'a' at 0x000001FFE8B45278>
# <Element 'a' at 0x000001FFE8B452C8>
# <Element 'a' at 0x000001FFE8B45318>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...