sgmllib.py 包含一個(gè)重要的類:
SGMLParser。
SGMLParser 將
HTML 分解成有用的片段,比如開(kāi)始標(biāo)記和結(jié)束標(biāo)記。一旦它成功地分解出某個(gè)數(shù)據(jù)為一個(gè)有用的片段,它會(huì)根據(jù)所發(fā)現(xiàn)的數(shù)據(jù),調(diào)用一個(gè)自身內(nèi)部的方法。為了使用這個(gè)分析器,您需要子類化
SGMLParser 類,并且覆蓋這些方法。
SGMLParser 將
HTML 分析成 8 類數(shù)據(jù),然后對(duì)每一類調(diào)用單獨(dú)的方法:
開(kāi)始標(biāo)記 (Start tag)
是一個(gè)開(kāi)始一個(gè)塊的 HTML 標(biāo)記,象 <html>,<head>,<body> 或 <pre> 等,或是一個(gè)獨(dú)一的標(biāo)記,象 <br> 或 <img> 等。當(dāng)它找到一個(gè)開(kāi)始標(biāo)記 tagname,SGMLParser 將查找名為 start_tagname 或 do_tagname 的方法。例如,當(dāng)它找到一個(gè) <pre> 標(biāo)記,它將查找一個(gè) start_pre 或 do_pre 的方法。如果找到了,SGMLParser 會(huì)使用這個(gè)標(biāo)記的屬性列表來(lái)調(diào)用這個(gè)方法;否則,它用這個(gè)標(biāo)記的名字和屬性列表來(lái)調(diào)用 unknown_starttag 方法。
結(jié)束標(biāo)記 (End tag)
是結(jié)束一個(gè)塊的 HTML 標(biāo)記,象 </html>,</head>,</body> 或 </pre> 等。當(dāng)找到一個(gè)結(jié)束標(biāo)記時(shí),SGMLParser 將查找名為 end_tagname 的方法。如果找到,SGMLParser 調(diào)用這個(gè)方法,否則它使用標(biāo)記的名字來(lái)調(diào)用 unknown_endtag 。
字符引用 (Character reference)
用字符的十進(jìn)制或等同的十六進(jìn)制來(lái)表示的轉(zhuǎn)義字符,象 。當(dāng)找到,SGMLParser 使用十進(jìn)制或等同的十六進(jìn)制字符文本來(lái)調(diào)用 handle_charref 。
實(shí)體引用 (Entity reference)
HTML 實(shí)體,象 ©。當(dāng)找到,SGMLParser 使用 HTML 實(shí)體的名字來(lái)調(diào)用 handle_entityref 。
注釋 (Comment)
HTML 注釋, 包括在 <!-- ... -->之間。當(dāng)找到,SGMLParser 用注釋內(nèi)容來(lái)調(diào)用 handle_comment。
處理指令 (Processing instruction)
HTML 處理指令,包括在 <? ... > 之間。當(dāng)找到,SGMLParser 用處理指令內(nèi)容來(lái)調(diào)用 handle_pi。
聲明 (Declaration)
HTML 聲明,如 DOCTYPE,包括在 <! ... >之間。當(dāng)找到,SGMLParser 用聲明內(nèi)容來(lái)調(diào)用 handle_decl。
文本數(shù)據(jù) (Text data)
文本塊。不滿足其它 7 種類別的任何東西。當(dāng)找到,SGMLParser 用文本來(lái)調(diào)用 handle_data。
urllib 模塊是標(biāo)準(zhǔn) Python 庫(kù)的一部分。它包含了一些函數(shù),可以從基于互聯(lián)網(wǎng)的 URL (主要指網(wǎng)頁(yè)) 來(lái)獲取信息并且真正取回?cái)?shù)據(jù)。urllib 模塊最簡(jiǎn)單的使用是提取用 urlopen 函數(shù)取回的網(wǎng)頁(yè)的整個(gè)文本。打開(kāi)一個(gè) URL 同 打開(kāi)一個(gè)文件相似。urlopen 的返回值是象文件一樣的對(duì)象,它具有一個(gè)文件對(duì)象一樣的方法。使用由 urlopen 所返回的類文件對(duì)象所能做的最簡(jiǎn)單的事情就是 read,它可以將網(wǎng)頁(yè)的整個(gè) HTML 讀到一個(gè)字符串中。這個(gè)對(duì)象也支持 readlines 方法,這個(gè)方法可以將文本按行放入一個(gè)列表中。當(dāng)用完這個(gè)對(duì)象,要確保將它 close,就如同一個(gè)普通的文件對(duì)象。
urllister.py
from sgmllib import SGMLParser
class URLLister(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.urls=[]
self.imgs=[]
def start_a(self, attrs):
href = [v for k, v in attrs if k=='href']
if href:
self.urls.extend(href)
def start_img(self, attrs):
img = [v for k, v in attrs if k=='src']
if img:
self.imgs.extend(img)
1.reset 由
SGMLParser 的
__init__ 方法來(lái)調(diào)用,也可以在創(chuàng)建一個(gè)分析器實(shí)例時(shí)手工來(lái)調(diào)用。所以如果您需要做初始化,在
reset 中去做,而不要在
__init__ 中做。這樣當(dāng)某人重用一個(gè)分析器實(shí)例時(shí),會(huì)正確地重新初始化。
2.象
k=='href' 的字符串比較是區(qū)分大小寫(xiě)的,但是這里是安全的。因?yàn)?
SGMLParser 會(huì)在創(chuàng)建
attrs 時(shí)將屬性名轉(zhuǎn)化為小寫(xiě)。
test.py
import urllib, urllister
usock=urllib.urlopen("http://www.aygfsteel.com/rain1102")
parser=urllister.URLLister()
parser.feed(usock.read())
usock.close()
parser.close()
for url in parser.urls:print url
for img in parser.imgs:print img
posted on 2007-10-17 10:51
周銳 閱讀(2201)
評(píng)論(0) 編輯 收藏 所屬分類:
Python