sgmllib Introduction
8.2.?sgmllib.py?介紹
HTML?處理分成三步:將?HTML?分解成它的組成片段,對(duì)片段進(jìn)行加工,接著將片段再重新合成 HTML。第一步是通過(guò)?sgmllib.py?來(lái)完成的,它是標(biāo)準(zhǔn)?Python?庫(kù)的一部分。
理解本章的關(guān)鍵是要知道?HTML?不只是文本,更是結(jié)構(gòu)化文本。這種結(jié)構(gòu)來(lái)源于開始與結(jié)束標(biāo)記的或多或少分級(jí)序列。通常您并不以這種方式處理?HTML?,而是以文本方式?在一個(gè)文本編輯中對(duì)其進(jìn)行處理,或以可視的方式?在一個(gè)瀏覽器中進(jìn)行瀏覽或頁(yè)面編輯工具中進(jìn)行編輯。sgmllib.py?表現(xiàn)出了?HTML?的結(jié)構(gòu)。
sgmllib.py?包含一個(gè)重要的類:SGMLParser。SGMLParser?將?HTML?分解成有用的片段,比如開始標(biāo)記和結(jié)束標(biāo)記。在它成功地分解出某個(gè)數(shù)據(jù)為一個(gè)有用的片段后,它會(huì)根據(jù)所發(fā)現(xiàn)的數(shù)據(jù),調(diào)用一個(gè)自身內(nèi)部的方法。為了使用這個(gè)分析器,您需要子類化?SGMLParser?類,并且覆蓋這些方法。這就是當(dāng)我說(shuō)它表示了?HTML?結(jié)構(gòu)?的意思:HTML?的結(jié)構(gòu)決定了方法調(diào)用的次序和傳給每個(gè)方法的參數(shù)。
SGMLParser?將?HTML?分析成 8 類數(shù)據(jù),然后對(duì)每一類調(diào)用單獨(dú)的方法:
開始標(biāo)記 (Start tag)| Python?2.0 存在一個(gè) bug,即?SGMLParser?完全不能識(shí)別聲明 (handle_decl?永遠(yuǎn)不會(huì)調(diào)用),這就意味著?DOCTYPE?被靜靜地忽略掉了。這個(gè)錯(cuò)誤在?Python?2.1 中改正了。 | |
sgmllib.py?所附帶的一個(gè)測(cè)試套件舉例說(shuō)明了這一點(diǎn)。您可以運(yùn)行?sgmllib.py,在命令行下傳入一個(gè)?HTML?文件的名字,然后它會(huì)在分析標(biāo)記和其它元素的同時(shí)將它們打印出來(lái)。它的實(shí)現(xiàn)是通過(guò)子類化SGMLParser?類,然后定義?unknown_starttag,unknown_endtag,handle_data?和其它方法來(lái)實(shí)現(xiàn)的。這些方法簡(jiǎn)單地打印出它們的參數(shù)。
| 在 Windows 下的?ActivePython?IDE?中,您可以在 “Run script” 對(duì)話框中指定命令行參數(shù)。用空格將多個(gè)參數(shù)分開。 | |
例?8.4.?sgmllib.py?的樣例測(cè)試
下面是一個(gè)片段,來(lái)自本書的?HTML?版本的目錄,toc.html。當(dāng)然,您的存儲(chǔ)路徑可能與我的有所不同。 (如果您還沒有下載本書的?HTML?版本,可以從?http://diveintopython.org/?下載。
c:\python23\lib> type "c:\downloads\diveintopython\html\toc\index.html" <!DOCTYPE htmlPUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Dive Into Python</title><link rel="stylesheet" href="diveintopython.css" type="text/css">... 略 ...通過(guò)?sgmllib.py?的測(cè)試套件來(lái)運(yùn)行它,會(huì)得到如下的輸出結(jié)果:
c:\python23\lib> python sgmllib.py "c:\downloads\diveintopython\html\toc\index.html" data: '\n\n' start tag: <html lang="en" > data: '\n ' start tag: <head> data: '\n ' start tag: <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" > data: '\n \n ' start tag: <title> data: 'Dive Into Python' end tag: </title> data: '\n ' start tag: <link rel="stylesheet" href="diveintopython.css" type="text/css" > data: '\n '... 略 ...下面是本章其它部分的路標(biāo):
- 子類化?SGMLParser?來(lái)創(chuàng)建從?HTML?文檔中抽取感興趣的數(shù)據(jù)的類。
- 子類化?SGMLParser?來(lái)創(chuàng)建?BaseHTMLProcessor,它覆蓋了所有8個(gè)處理方法,然后使用它們從片段中重建原始的?HTML。
- 子類化?BaseHTMLProcessor?來(lái)創(chuàng)建?Dialectizer,它增加了一些方法,專門用來(lái)處理指定的?HTML?標(biāo)記,然后覆蓋了?handle_data?方法,提供了用來(lái)處理?HTML?標(biāo)記之間文本塊的框架。
- 子類化?Dialectizer?來(lái)創(chuàng)建定義了文本處理規(guī)則的類。這些規(guī)則被?Dialectizer.handle_data?使用。
- 編寫一個(gè)測(cè)試套件,它可以從?http://diveintopython.org/?處抓取一個(gè)真正的 web 頁(yè)面,然后處理它。
繼續(xù)閱讀本章,您還可以學(xué)習(xí)到有關(guān)?locals、globals?和基于 dictionary 的字符串格式化的內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的sgmllib Introduction的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python IO
- 下一篇: Crawler Index Page