| 導航:起始頁 > Dive Into Python > HTML 處理 > sgmllib.py 介紹 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
HTML 處理分成三步:將 HTML 分解成它的組成片段,對片段進行加工,接著將片段再重新合成 HTML。第一步是通過 sgmllib.py 來完成的,它是標準 Python 庫的一部分。
理解本章的關鍵是要知道 HTML 不只是文本,更是結構化文本。這種結構來源于開始與結束標記的或多或少分級序列。通常您并不以這種方式處理 HTML ,而是以文本方式 在一個文本編輯中對其進行處理,或以可視的方式 在一個瀏覽器中進行瀏覽或頁面編輯工具中進行編輯。sgmllib.py 表現出了 HTML 的結構。
sgmllib.py 包含一個重要的類:SGMLParser。SGMLParser 將 HTML 分解成有用的片段,比如開始標記和結束標記。在它成功地分解出某個數據為一個有用的片段后,它會根據所發現的數據,調用一個自身內部的方法。為了使用這個分析器,您需要子類化 SGMLParser 類,并且覆蓋這些方法。這就是當我說它表示了 HTML 結構 的意思:HTML 的結構決定了方法調用的次序和傳給每個方法的參數。
SGMLParser 將 HTML 分析成 8 類數據,然后對每一類調用單獨的方法:
| 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” 對話框中指定命令行參數。用空格將多個參數分開。 | |
下面是一個片段,來自本書的 HTML 版本的目錄,toc.html。當然,您的存儲路徑可能與我的有所不同。 (如果您還沒有下載本書的 HTML 版本,可以從 http://diveintopython.org/ 下載。
c:\python23\lib> type "c:\downloads\diveintopython\html\toc\index.html"
<!DOCTYPE html
PUBLIC "-//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 ' ... 略 ...
下面是本章其它部分的路標:
繼續閱讀本章,您還可以學習到有關 locals、globals 和基于 dictionary 的字符串格式化的內容。
<< HTML 處理 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
從 HTML 文檔中提取數據 >> |