<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            8.2. sgmllib.py 介紹

            HTML 處理分成三步:將 HTML 分解成它的組成片段,對片段進行加工,接著將片段再重新合成 HTML。第一步是通過 sgmllib.py 來完成的,它是標準 Python 庫的一部分。

            理解本章的關鍵是要知道 HTML 不只是文本,更是結構化文本。這種結構來源于開始與結束標記的或多或少分級序列。通常您并不以這種方式處理 HTML ,而是以文本方式 在一個文本編輯中對其進行處理,或以可視的方式 在一個瀏覽器中進行瀏覽或頁面編輯工具中進行編輯。sgmllib.py 表現出了 HTML結構

            sgmllib.py 包含一個重要的類:SGMLParserSGMLParserHTML 分解成有用的片段,比如開始標記和結束標記。在它成功地分解出某個數據為一個有用的片段后,它會根據所發現的數據,調用一個自身內部的方法。為了使用這個分析器,您需要子類化 SGMLParser 類,并且覆蓋這些方法。這就是當我說它表示了 HTML 結構 的意思:HTML 的結構決定了方法調用的次序和傳給每個方法的參數。

            SGMLParserHTML 分析成 8 類數據,然后對每一類調用單獨的方法:

            開始標記 (Start tag)
            是開始一個塊的 HTML 標記,像 <html><head><body><pre> 等,或是一個獨一的標記,像 <br><img> 等。當它找到一個開始標記 tagnameSGMLParser 將查找名為 start_tagnamedo_tagname 的方法。例如,當它找到一個 <pre> 標記,它將查找一個 start_predo_pre 的方法。如果找到了,SGMLParser 會使用這個標記的屬性列表來調用這個方法;否則,它用這個標記的名字和屬性列表來調用 unknown_starttag 方法。
            結束標記 (End tag)
            是結束一個塊的 HTML 標記,像 </html></head></body></pre> 等。當找到一個結束標記時,SGMLParser 將查找名為 end_tagname 的方法。如果找到,SGMLParser 調用這個方法,否則它使用標記的名字來調用 unknown_endtag
            字符引用 (Character reference)
            用字符的十進制或等同的十六進制來表示的轉義字符,像 &#160;。當找到,SGMLParser 使用十進制或等同的十六進制字符文本來調用 handle_charref
            實體引用 (Entity reference)
            HTML 實體,像 &copy;。當找到,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
            重要
            Python 2.0 存在一個 bug,即 SGMLParser 完全不能識別聲明 (handle_decl 永遠不會調用),這就意味著 DOCTYPE 被靜靜地忽略掉了。這個錯誤在 Python 2.1 中改正了。

            sgmllib.py 所附帶的一個測試套件舉例說明了這一點。您可以運行 sgmllib.py,在命令行下傳入一個 HTML 文件的名字,然后它會在分析標記和其它元素的同時將它們打印出來。它的實現是通過子類化 SGMLParser 類,然后定義 unknown_starttagunknown_endtaghandle_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 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      '
            
            ... 略 ...
            

            下面是本章其它部分的路標:

            繼續閱讀本章,您還可以學習到有關 localsglobals 和基于 dictionary 的字符串格式化的內容。

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线