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)