python htmllib.HTMLParser處理A標籤獲取鏈接和描述

HTMLParser類中有針對HTML標籤的相應的函數,通過自定義,重載類中的函數來處理一些標籤,函數如下:

HTMLParser.anchor_bgn(href, name, type):#a標籤開始的時候被調用,參數是A標籤的屬性值

HTMLParser.anchor_end() #錨點標籤結束的時候處理

HTMLParser.save_bgn():#開始在緩衝區中保存字符數據,通過save_end()檢索存儲的數據。save_bgn()/ save_end()對可能不能嵌套使用。

HTMLParser.save_end():#結束緩衝字符數據,並返回自前調用save_bgn()保存所有數據。一個沒有前面的調用save_bgn()調用此方法將引發TypeError異常。

HTMLParser.handle_image(source, alt[, ismap[, align[, width[, height]]]]):調用此方法來處理圖像。默認實現只是簡單地傳遞到handle_data()方法的alt值。

HTMLParser.reset()  #重置實例.所有未處理的數據都會丟失.在初始化時自動調用. 

HTMLParser.feed(data) #給分析器餵食.在由完整元素構成的情況下工作;不完整數據情況下,會進行緩衝知道更多數據加進來或者 close() 被調用. 


HTMLParser.close()  #處理所有緩衝數據.這個方法可以被派生類重定義,以便在輸入結束後處理額外的事情,重定義的版本也要調用 HTMLParser 基類的 close() 方法. 

HTMLParser.getpos() #返回當前行數和列數 

HTMLParser.get_starttag_text() #返回最近打開過得開始標記處的文本.通常不會用到

HTMLParser.handle_starttag(tag, attrs) #該方法用來處理一個標記的開始.tag參數是tag的名字的小寫化.attrs參數是一個list,由(name,value)組成,反映了<>裏面的屬性. name會被翻譯成小寫字母,在value中的引號也被移除了,字符實體引用也會被替換.例如,有個 tag<A HREF=”http://www.cwi.nl/”> ,那麼使用該方法就該這麼做: handle_starttag('a', [('href','http://www.cwi.nl/')]) 

HTMLParser.handle_startendtag(tag, attrs) #和handle_starttag()類似,用來處理XHTML風格的空標籤(<a .../>).可能被子類重載

HTMLParser.handle_endtag(tag) #該方法用來處理元素結束標記.可以被派生類重載;基類什麼也不做. tag參數是tag的name轉化來的小寫字母. 

HTMLParser.handle_data(data) #該方法用來處理隨機的數據.

HTMLParser.handle_charref(name) #處理 &#ref 格式的字符引用.

HTMLParser.handle_entityref(name)  #處理一般的 &name 格式的實體引用. name 是一個一般的實體引用.

HTMLParser.handle_comment(data) #處理遇到註釋的情況.註釋參數爲在——和——之間的字符串文本,而不是分隔符自身.例如 <!--text--> ,該方法將調用'text'.

HTMLParser.handle_decl(decl) #當分析器遇到SGML聲明時調用此方法. decl 參數是 <!...> 標記裏的整個內容.

HTMLParser.handle_pi(data) #處理命令, data 參數包含整個的處理命令.例如 <?proc color=’red'> ,該方法應寫成 handle_pi("proc color='red'")

下面是處理A標籤的例子:

#!/usr/bin/python
#encoding='utf-8'
import htmllib,urllib,formatter,string
'''
import chardet,sys
type = sys.getdefaultencoding()
'''
class GetLinks(htmllib.HTMLParser): #從HTMLParser類中繼承
    def __init__(self): #初始化的時候調用,將links設置爲空。這裏的links爲字典結構
        self.links = {} #存放地址->鏈接的字典
        f = formatter.NullFormatter()#將傳輸過來的數據不做處理,格式化爲數據流
        htmllib.HTMLParser.__init__(self, f)

    def anchor_bgn(self, href, name, type): #錨點標籤開始的時候處理
        self.save_bgn()
        self.link = href

    def anchor_end(self): #錨點標籤結束的時候處理
        text = string.strip(self.save_end()) #去掉A標籤保留A標籤的信息
        if self.link and text:
            self.links[text] = self.link#self.links.get(text, []) + [self.link]
            #print self.links
            #exit()
fp = urllib.urlopen("http://www.baidu.com") #打開指定的URL
data = fp.read()
fp.close()

linkdemo = GetLinks() #實例化一個LinkDemo對象
linkdemo.feed(data) #給HTMLParser餵食
linkdemo.close()

for href, link in linkdemo.links.items(): #打印相關的信息
    print href, "=>", link

輸出:

hao123 => http://www.hao123.com

搜索設置 => /gaoji/preferences.html

使用百度前必讀 => /duty/

加入百度推廣 => http://e.baidu.com/?refer=888


還有個例子:

#!/usr/bin/python
#encoding=utf-8
import HTMLParser

class MyParser(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)                
    def handle_starttag(self, tag, attrs):
        # 這裏重新定義了處理開始標籤的函數
        if tag == 'a':
            # 判斷標籤<a>的屬性
            for name,value in attrs:
                if name == 'href':
                    print value
        
if __name__ == '__main__':
    a = '<html><head><title>test</title><body><a href="http: //www.163.com">鏈接到163</a><a href="http://www.focus.cn">焦點</a></body></html>' 
    my = MyParser()
    # 傳入要分析的數據,是html的。
    my.feed(a)

點擊打開鏈接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章