Python / BeautifulSoup:如何直接查看代码注释?

时间:2011-04-03 06:14:29

标签: python beautifulsoup

我正在使用BeautifulSoup解析一些网页并尝试在库中工作(而不是尝试使用强制强制正则表达式来解决所有问题。)

我正在查看的页面结构如下:

<!--comment--> 
<div>a</div>
<div>b</div>
<div>c</div>
<!--comment--> 
<div>a</div>
<div>b</div
<div>c</div

我想分别解析每个部分。有没有办法告诉beautifulsoup打破相同评论之间的区域?

谢谢!

2 个答案:

答案 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。