HTML解析器Python

3

我正在尝试解析一个网站。我正在使用HTMLParser模块。问题是,我想解析在注释<!-- /topOfPage -->之后的第一个<a href="">,但我不知道如何做。所以我在文档中发现有一个名为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()

如何实现呢?

2个回答

2

你需要一个附加变量来指示解析器刚刚经过了注释,这样你就可以保存它后面的第一个链接的引用。

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']]

1

handle_comment返回定界符之间的所有数据。

在这个例子中,实际上数据是" /topOfPage "(注意空格和/)。

你也可以这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接