【问题标题】:html parser pythonhtml解析器python
【发布时间】:2011-11-03 23:22:14
【问题描述】:

我正在尝试解析网站。我正在使用 HTMLParser 模块。问题是我想解析评论后的第一个<a href=""><!-- /topOfPage -->,但我真的不知道该怎么做。所以我在文档中发现有一个函数叫做handle_comment,但是我还没有找到如何正确使用它。我有以下内容:

import HTMLParser

class LinkFinder(HTMLParser.HTMLParser):
def __init__(self, *args, **kwargs):
    # Can't use super() - HTMLParser is an old-style class
    HTMLParser.HTMLParser.__init__(self, *args, **kwargs)
    self.in_linktag = False
    self.url_cache = []
def handle_comment(self,data):
    if data == "topOfPage":
        print data
def handle_starttag(self, tag, attrs):
    if tag == "a" and any("href" == t[0] for t in attrs): # found link
        self.in_linktag = True
        self.url_cache.append([dict(attrs)['href']])
def handle_endtag(self, tag):
    if tag == "a" and self.in_linktag: # ignore '<a name=""...'
        self.in_linktag = False
def handle_data(self, data):
    if self.in_linktag:
        self.url_cache[-1].append(data)
TESTDATA = """
< html>
< body>
< div>
 < ul>
    < !-- /topOfPage --> 
< tr >
    < td class="empty-cell-left">&nbsp;</td>
    < td class="image">


    < a  href="http://test" rel="nofollow">
 < ul>
< /div>
< /body>
 < /html>
"""
def main():
lf = LinkFinder()
lf.feed(TESTDATA)
lf.close()
print lf.url_cache
if __name__ == "__main__":
    main()

怎么做?

【问题讨论】:

    标签: python html-parsing


    【解决方案1】:

    您需要一个额外的变量来指示解析器刚刚经过评论,以便您可以保存来自它之后的第一个链接的引用。

    def __init__(self, *args, **kwargs):
        # ...
        self.first_link_after_comment = False
    

    那么,当你遇到评论时,必须切换标志。

    def handle_comment(self, data):
        if data.strip() == '/topOfPage':
            self.first_link_after_comment = True
    

    当你处理一个开始标签时,如果解析没有通过注释,你要确保让它通过

    def handle_starttag(self, tag, attrs):
        if not self.first_link_after_comment:
            return
        # ...
    

    相反,当您处理结束标记时,您希望确认任务已完成。

    def handle_endtag(self, tag):
        if tag == 'a' and self.in_linktag: # ignore '<a name=""...'
            self.in_linktag = False
            self.first_link_after_comment = False
    

    最后,当您追加数据时,请确保它不仅仅是一个空字符串或仅包含空格。

    def handle_data(self, data):
        if self.in_linktag and data.strip():
            self.url_cache[-1].append(data)
    

    你来了。

    $ your_script.py
    [['http://test']]
    

    【讨论】:

    • 非常非常非常感谢!
    【解决方案2】:

    handle_comment 返回分隔符之间的所有数据。

    在本例中,数据实际上是“/topOfPage”(注意空格和 /)。

    您也可以这样做:

    def handle_comment(self,data):
        if "topOfPage" in data:
            print data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2020-04-17
      • 2012-11-25
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多