2011-11-03 93 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