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)
點擊打開鏈接