【发布时间】:2020-08-31 06:56:24
【问题描述】:
这是该问题的示例复制
from bs4 import BeautifulSoup as soup
data = soup("""
<div>
<h3 id="pivot"></h3>
<table></table>
<h3 id="next-head"></h3>
<table></table>
<h3 id="next2-head"></h3>
</div>
""", 'lxml')
exists = data.find('h3', {'id': 'pivot'})
print('exists', exists)
tables = soup('<div></div>', 'lxml')
div = tables.find('div')
for sib in (exists.next_siblings):
print('sibling', sib)
if sib.name == 'h3':
print('break')
break
div.append(sib)
print('tables', tables)
上面的代码什么也不打印
输出:
exists <h3 id="pivot"></h3>
sibling
tables <html><body><div>
</div></body></html>
而另一个变体按预期工作
# same as above
...
print('exists', exists)
tables = soup('<div></div>', 'lxml')
div = tables.find('div')
tabs = []
for sib in (exists.next_siblings):
print('sibling', sib)
if sib.name == 'h3':
print('break')
break
tabs.append(sib)
print('tabs', tabs)
tabs 变量包含预期结果,生成器展开
exists <h3 id="pivot"></h3>
sibling
sibling <table></table>
sibling
sibling <h3 id="next-head"></h3>
break
tabs ['\n', <table></table>, '\n']
在第一个示例中将生成器设置为list(existing.next_siblings) 列表将解决这个奇怪的问题。
这是一个 python 错误还是一个漂亮的汤错误,或者这是预期的行为?
λ pip freeze | grep 'beautifulsoup4'
beautifulsoup4==4.9.1
λ python -V
Python 3.8.0
【问题讨论】:
-
这并不奇怪...在第一个示例中,您正在更改文档树,同时对其进行迭代。
div.append(sib)将从树中删除sib(在这种情况下,sib的类型为空NavigableString)并且循环结束。正如您所写,您需要首先将兄弟姐妹放入一个列表,然后对其进行迭代。 -
我不知道附加到不同的树会从现有的树中删除它。我只是看了一下来源,假设它会复制。谢谢你。 @AndrejKesely 你想回答这个问题吗?
标签: python beautifulsoup generator