我正在使用BeautifulSoup解析一些网页并尝试在库中工作(而不是尝试使用强制强制正则表达式来解决所有问题。)
我正在查看的页面结构如下:
<!--comment-->
<div>a</div>
<div>b</div>
<div>c</div>
<!--comment-->
<div>a</div>
<div>b</div
<div>c</div
我想分别解析每个部分。有没有办法告诉beautifulsoup打破相同评论之间的区域?
谢谢!
答案 0 :(得分:1)
评论是节点,就像其他任何东西一样:
from BeautifulSoup import BeautifulSoup
from BeautifulSoup import Comment
from BeautifulSoup import NavigableString
text = BeautifulSoup("""<!--comment--><div>a</div><div>b</div><div>c</div>
<!--comment--><div>a</div><div>b</div><div>c</div>""")
comments = text.findAll(text=lambda elm: isinstance(elm, Comment))
for comment in comments:
next_sib = comment.nextSibling
while not isinstance(next_sib, Comment) and \
not isinstance(next_sib, NavigableString) and next_sib:
# This prints each sibling while it isn't whitespace or another comment
# Append next_sib to a list, dictionary, etc, etc and
# do what you want with it
print next_sib
next_sib = next_sib.nextSibling
修改强>
它没有检测到相同的注释(注释文本?),但你可以通过检查注释文本是否与前一个注释块相同来解决这个问题。
答案 1 :(得分:0)
我没有看到任何用于直接在BeautifulSoup中获取注释节点的高级API。相反,你必须自己走过解析树。
请参阅1
示例显示您可以检查“评论”类的节点......这就是您所拥有的。
另一个可怕的想法:
您可以使用soup.prettify()逐行渲染文档,然后逐行解析生成的输出,检查注释并再次手动将以下行提供给BeautifulSoup。