2011-11-03 94 views
3

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

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

你需要一个额外的变量来表示,解析器刚刚来到过去的评论,这样就可以节省从之后的第一个链接的参考。

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

非常感谢你! – user1010775

1

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

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

你也可以这样做,而不是:

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