sgmllib.py 包含一個重要的類:
SGMLParser。
SGMLParser 將
HTML 分解成有用的片段,比如開始標記和結束標記。一旦它成功地分解出某個數據為一個有用的片段,它會根據所發現的數據,調用一個自身內部的方法。為了使用這個分析器,您需要子類化
SGMLParser 類,并且覆蓋這些方法。
SGMLParser 將
HTML 分析成 8 類數據,然后對每一類調用單獨的方法:
開始標記 (Start tag)
是一個開始一個塊的 HTML 標記,象 <html>,<head>,<body> 或 <pre> 等,或是一個獨一的標記,象 <br> 或 <img> 等。當它找到一個開始標記 tagname,SGMLParser 將查找名為 start_tagname 或 do_tagname 的方法。例如,當它找到一個 <pre> 標記,它將查找一個 start_pre 或 do_pre 的方法。如果找到了,SGMLParser 會使用這個標記的屬性列表來調用這個方法;否則,它用這個標記的名字和屬性列表來調用 unknown_starttag 方法。
結束標記 (End tag)
是結束一個塊的 HTML 標記,象 </html>,</head>,</body> 或 </pre> 等。當找到一個結束標記時,SGMLParser 將查找名為 end_tagname 的方法。如果找到,SGMLParser 調用這個方法,否則它使用標記的名字來調用 unknown_endtag 。
字符引用 (Character reference)
用字符的十進制或等同的十六進制來表示的轉義字符,象 。當找到,SGMLParser 使用十進制或等同的十六進制字符文本來調用 handle_charref 。
實體引用 (Entity reference)
HTML 實體,象 ©。當找到,SGMLParser 使用 HTML 實體的名字來調用 handle_entityref 。
注釋 (Comment)
HTML 注釋, 包括在 <!-- ... -->之間。當找到,SGMLParser 用注釋內容來調用 handle_comment。
處理指令 (Processing instruction)
HTML 處理指令,包括在 <? ... > 之間。當找到,SGMLParser 用處理指令內容來調用 handle_pi。
聲明 (Declaration)
HTML 聲明,如 DOCTYPE,包括在 <! ... >之間。當找到,SGMLParser 用聲明內容來調用 handle_decl。
文本數據 (Text data)
文本塊。不滿足其它 7 種類別的任何東西。當找到,SGMLParser 用文本來調用 handle_data。
urllib 模塊是標準 Python 庫的一部分。它包含了一些函數,可以從基于互聯網的 URL (主要指網頁) 來獲取信息并且真正取回數據。urllib 模塊最簡單的使用是提取用 urlopen 函數取回的網頁的整個文本。打開一個 URL 同 打開一個文件相似。urlopen 的返回值是象文件一樣的對象,它具有一個文件對象一樣的方法。使用由 urlopen 所返回的類文件對象所能做的最簡單的事情就是 read,它可以將網頁的整個 HTML 讀到一個字符串中。這個對象也支持 readlines 方法,這個方法可以將文本按行放入一個列表中。當用完這個對象,要確保將它 close,就如同一個普通的文件對象。
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__ 方法來調用,也可以在創建一個分析器實例時手工來調用。所以如果您需要做初始化,在
reset 中去做,而不要在
__init__ 中做。這樣當某人重用一個分析器實例時,會正確地重新初始化。
2.象
k=='href' 的字符串比較是區分大小寫的,但是這里是安全的。因為
SGMLParser 會在創建
attrs 時將屬性名轉化為小寫。
test.py
import urllib, urllister
usock=urllib.urlopen("http://m.tkk7.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
周銳 閱讀(2198)
評論(0) 編輯 收藏 所屬分類:
Python