<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 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) 是開始一個塊的 HTML 標記,像 `&lt;html&gt;`、`&lt;head&gt;`、`&lt;body&gt;` 或 `&lt;pre&gt;` 等,或是一個獨一的標記,像 `&lt;br&gt;` 或 `&lt;img&gt;` 等。當它找到一個開始標記 _`tagname`_,`SGMLParser` 將查找名為 `start__`tagname`_` 或 `do__`tagname`_` 的方法。例如,當它找到一個 `&lt;pre&gt;` 標記,它將查找一個 `start_pre` 或 `do_pre` 的方法。如果找到了,`SGMLParser` 會使用這個標記的屬性列表來調用這個方法;否則,它用這個標記的名字和屬性列表來調用 `unknown_starttag` 方法。 結束標記 (End tag) 是結束一個塊的 HTML 標記,像 `&lt;/html&gt;`、`&lt;/head&gt;`、`&lt;/body&gt;` 或 `&lt;/pre&gt;` 等。當找到一個結束標記時,`SGMLParser` 將查找名為 `end__`tagname`_` 的方法。如果找到,`SGMLParser` 調用這個方法,否則它使用標記的名字來調用 `unknown_endtag` 。 字符引用 (Character reference) 用字符的十進制或等同的十六進制來表示的轉義字符,像 `&#160;`。當找到,`SGMLParser` 使用十進制或等同的十六進制字符文本來調用 `handle_charref` 。 實體引用 (Entity reference) HTML 實體,像 `&copy;`。當找到,`SGMLParser` 使用 HTML 實體的名字來調用 `handle_entityref` 。 注釋 (Comment) HTML 注釋,包括在 `&lt;!-- ... --&gt;`之間。當找到,`SGMLParser` 用注釋內容來調用 `handle_comment`。 處理指令 (Processing instruction) HTML 處理指令,包括在 `&lt;? ... &gt;` 之間。當找到,`SGMLParser` 用處理指令內容來調用 `handle_pi`。 聲明 (Declaration) HTML 聲明,如 `DOCTYPE`,包括在 `&lt;! ... &gt;`之間。當找到,`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_starttag`,`unknown_endtag`,`handle_data` 和其它方法來實現的。這些方法簡單地打印出它們的參數。 > 提示 > 在 Windows 下的 ActivePython IDE 中,您可以在 “Run script” 對話框中指定命令行參數。用空格將多個參數分開。 ## 例?8.4.?`sgmllib.py` 的樣例測試 下面是一個片段,來自本書的 HTML 版本的目錄,toc.html。當然,您的存儲路徑可能與我的有所不同。 (如果您還沒有下載本書的 HTML 版本,可以從 [http://diveintopython.org/](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 ' ... 略 ... ``` 下面是本章其它部分的路標: * 子類化 `SGMLParser` 來創建從 HTML 文檔中抽取感興趣的數據的類。 * 子類化 `SGMLParser` 來創建 `BaseHTMLProcessor`,它覆蓋了所有8個處理方法,然后使用它們從片段中重建原始的 HTML。 * 子類化 `BaseHTMLProcessor` 來創建 `Dialectizer`,它增加了一些方法,專門用來處理指定的 HTML 標記,然后覆蓋了 `handle_data` 方法,提供了用來處理 HTML 標記之間文本塊的框架。 * 子類化 `Dialectizer` 來創建定義了文本處理規則的類。這些規則被 `Dialectizer.handle_data` 使用。 * 編寫一個測試套件,它可以從 `http://diveintopython.org/` 處抓取一個真正的 web 頁面,然后處理它。 繼續閱讀本章,您還可以學習到有關 `locals`、`globals` 和基于 dictionary 的字符串格式化的內容。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看