Python beautifulsoup next#u#x27;t形环

Python beautifulsoup next#u#x27;t形环,python,beautifulsoup,generator,Python,Beautifulsoup,Generator,这是本期的复制品样本 从bs4导入BeautifulSoup作为汤 数据=汤(“”) “”,'lxml') exists=data.find('h3',{'id':'pivot'}) 打印('exists',exists) 表=汤(“”,'lxml') div=tables.find('div') 对于中的兄弟姐妹(存在。下一个兄弟姐妹): 打印('sibling',sib) 如果sib.name==“h3”: 打印(‘中断’) 打破 div.append(sib) 打印('表格',表格) 上

这是本期的复制品样本

从bs4导入BeautifulSoup作为汤
数据=汤(“”)
“”,'lxml')
exists=data.find('h3',{'id':'pivot'})
打印('exists',exists)
表=汤(“”,'lxml')
div=tables.find('div')
对于中的兄弟姐妹(存在。下一个兄弟姐妹):
打印('sibling',sib)
如果sib.name==“h3”:
打印(‘中断’)
打破
div.append(sib)
打印('表格',表格)
上面的代码不打印任何内容

输出:

exists <h3 id="pivot"></h3>
sibling

tables <html><body><div>
</div></body></html>
在您的第一个示例中:

for sib in (exists.next_siblings):
    print('sibling', sib)
    if sib.name == 'h3':
        print('break')
        break
    div.append(sib)
您正在修改文档树(使用
div.append(sib)
),同时对其进行迭代。命令
div.append(sib)
从文档树
exists
中删除
sib
,并将其放置在树
表中。这是一种糟糕的做法,因为它只进行一次迭代

在第一次迭代中,
sib
类型为
navigablesting
,值为
“\n”
(换行符)。因此,当您打印
表格时,您可以在打开
标记后看到一个换行符


正确的方法是将同级存储到列表中,然后遍历该列表。

这并不奇怪……在第一个示例中,您在遍历文档树的同时更改了文档树
div.append(sib)
将从树中删除
sib
(在这种情况下,
sib
的类型为空
navigablesting
),循环结束。正如您所写的,您需要首先将兄弟姐妹放到一个列表中,然后对它们进行迭代。我不知道附加到其他树会将其从现有树中删除。我只是看了一下资料来源,假设它会复制一份。多谢各位@你愿意回答这个问题吗?
for sib in (exists.next_siblings):
    print('sibling', sib)
    if sib.name == 'h3':
        print('break')
        break
    div.append(sib)