<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    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 的字符串格式化的內容。

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频