有什么办法可以从bs4 findAll()获得迭代器,例如re.findIter()吗?

时间:2018-12-15 09:03:44

标签: python regex python-3.x beautifulsoup iterator

我不希望bs4解析整个文档,但是我也没有任何方法使用limit参数,因为我不知道我需要预先解析多少个链接。如果这是re,在这种情况下,我会使用re.finditer()。但是我在bs4中找不到类似的功能。

2 个答案:

答案 0 :(得分:2)

否,BeautifulSoup没有与find_all()类似的“迭代/惰性”版本。

您可以在不解析整个文档的情况下要做的一件事是SoupStrainer,这至少可以使您BeautifulSoup专注于仅解析页面的所需元素。

答案 1 :(得分:1)

由于您评论要处理XML文档,因此可以使用其元素实现.iterElementTree(假设您使用的是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>