sgmllib Introduction
8.2.?sgmllib.py?介紹
HTML?處理分成三步:將?HTML?分解成它的組成片段,對片段進行加工,接著將片段再重新合成 HTML。第一步是通過?sgmllib.py?來完成的,它是標準?Python?庫的一部分。
理解本章的關鍵是要知道?HTML?不只是文本,更是結構化文本。這種結構來源于開始與結束標記的或多或少分級序列。通常您并不以這種方式處理?HTML?,而是以文本方式?在一個文本編輯中對其進行處理,或以可視的方式?在一個瀏覽器中進行瀏覽或頁面編輯工具中進行編輯。sgmllib.py?表現出了?HTML?的結構。
sgmllib.py?包含一個重要的類:SGMLParser。SGMLParser?將?HTML?分解成有用的片段,比如開始標記和結束標記。在它成功地分解出某個數據為一個有用的片段后,它會根據所發現的數據,調用一個自身內部的方法。為了使用這個分析器,您需要子類化?SGMLParser?類,并且覆蓋這些方法。這就是當我說它表示了?HTML?結構?的意思:HTML?的結構決定了方法調用的次序和傳給每個方法的參數。
SGMLParser?將?HTML?分析成 8 類數據,然后對每一類調用單獨的方法:
開始標記 (Start tag)| Python?2.0 存在一個 bug,即?SGMLParser?完全不能識別聲明 (handle_decl?永遠不會調用),這就意味著?DOCTYPE?被靜靜地忽略掉了。這個錯誤在?Python?2.1 中改正了。 | |
sgmllib.py?所附帶的一個測試套件舉例說明了這一點。您可以運行?sgmllib.py,在命令行下傳入一個?HTML?文件的名字,然后它會在分析標記和其它元素的同時將它們打印出來。它的實現是通過子類化SGMLParser?類,然后定義?unknown_starttag,unknown_endtag,handle_data?和其它方法來實現的。這些方法簡單地打印出它們的參數。
| 在 Windows 下的?ActivePython?IDE?中,您可以在 “Run script” 對話框中指定命令行參數。用空格將多個參數分開。 | |
例?8.4.?sgmllib.py?的樣例測試
下面是一個片段,來自本書的?HTML?版本的目錄,toc.html。當然,您的存儲路徑可能與我的有所不同。 (如果您還沒有下載本書的?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">... 略 ...通過?sgmllib.py?的測試套件來運行它,會得到如下的輸出結果:
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 '... 略 ...下面是本章其它部分的路標:
- 子類化?SGMLParser?來創建從?HTML?文檔中抽取感興趣的數據的類。
- 子類化?SGMLParser?來創建?BaseHTMLProcessor,它覆蓋了所有8個處理方法,然后使用它們從片段中重建原始的?HTML。
- 子類化?BaseHTMLProcessor?來創建?Dialectizer,它增加了一些方法,專門用來處理指定的?HTML?標記,然后覆蓋了?handle_data?方法,提供了用來處理?HTML?標記之間文本塊的框架。
- 子類化?Dialectizer?來創建定義了文本處理規則的類。這些規則被?Dialectizer.handle_data?使用。
- 編寫一個測試套件,它可以從?http://diveintopython.org/?處抓取一個真正的 web 頁面,然后處理它。
繼續閱讀本章,您還可以學習到有關?locals、globals?和基于 dictionary 的字符串格式化的內容。
總結
以上是生活随笔為你收集整理的sgmllib Introduction的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python IO
- 下一篇: Crawler Index Page