<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](html.entities.xhtml "html.entities --- HTML 一般實體的定義") | - [上一頁](html.xhtml "html --- 超文本標記語言支持") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 標準庫](index.xhtml) ? - [結構化標記處理工具](markup.xhtml) ? - $('.inline-search').show(0); | # [`html.parser`](#module-html.parser "html.parser: A simple parser that can handle HTML and XHTML.") --- 簡單的 HTML 和 XHTML 解析器 **源代碼:** [Lib/html/parser.py](https://github.com/python/cpython/tree/3.7/Lib/html/parser.py) \[https://github.com/python/cpython/tree/3.7/Lib/html/parser.py\] - - - - - - 這個模塊定義了一個 [`HTMLParser`](#html.parser.HTMLParser "html.parser.HTMLParser") 類,為 HTML(超文本標記語言)和 XHTML 文本文件解析提供基礎。 *class* `html.parser.``HTMLParser`(*\**, *convert\_charrefs=True*)創建一個能解析無效標記的解析器實例。 如果 *convert\_charrefs* 為 `True` (默認值),則所有字符引用( `script`/`style` 元素中的除外)都會自動轉換為相應的 Unicode 字符。 一個 [`HTMLParser`](#html.parser.HTMLParser "html.parser.HTMLParser") 類的實例用來接受 HTML 數據,并在標記開始、標記結束、文本、注釋和其他元素標記出現的時候調用對應的方法。要實現具體的行為,請使用 [`HTMLParser`](#html.parser.HTMLParser "html.parser.HTMLParser") 的子類并重載其方法。 這個解析器不檢查結束標記是否與開始標記匹配,也不會因外層元素完畢而隱式關閉了的元素引發結束標記處理。 在 3.4 版更改: *convert\_charrefs* 關鍵字參數被添加。 在 3.5 版更改: *convert\_charrefs* 參數的默認值現在為 `True`。 ## HTML 解析器的示例程序 下面是簡單的 HTML 解析器的一個基本示例,使用 [`HTMLParser`](#html.parser.HTMLParser "html.parser.HTMLParser") 類,當遇到開始標記、結束標記以及數據的時候將內容打印出來。 ``` from html.parser import HTMLParser class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): print("Encountered a start tag:", tag) def handle_endtag(self, tag): print("Encountered an end tag :", tag) def handle_data(self, data): print("Encountered some data :", data) parser = MyHTMLParser() parser.feed('<html><head><title>Test</title></head>' '<body><h1>Parse me!</h1></body></html>') ``` 輸出是: ``` Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h1 Encountered some data : Parse me! Encountered an end tag : h1 Encountered an end tag : body Encountered an end tag : html ``` ## [`HTMLParser`](#html.parser.HTMLParser "html.parser.HTMLParser") 方法 [`HTMLParser`](#html.parser.HTMLParser "html.parser.HTMLParser") 實例有下列方法: `HTMLParser.``feed`(*data*)填充一些文本到解析器中。如果包含完整的元素,則被處理;如果數據不完整,將被緩沖直到更多的數據被填充,或者 [`close()`](#html.parser.HTMLParser.close "html.parser.HTMLParser.close") 被調用。*data* 必須為 [`str`](stdtypes.xhtml#str "str") 類型。 `HTMLParser.``close`()如同后面跟著一個文件結束標記一樣,強制處理所有緩沖數據。這個方法能被派生類重新定義,用于在輸入的末尾定義附加處理,但是重定義的版本應當始終調用基類 [`HTMLParser`](#html.parser.HTMLParser "html.parser.HTMLParser") 的 [`close()`](#html.parser.HTMLParser.close "html.parser.HTMLParser.close") 方法。 `HTMLParser.``reset`()重置實例。丟失所有未處理的數據。在實例化階段被隱式調用。 `HTMLParser.``getpos`()返回當前行號和偏移值。 `HTMLParser.``get_starttag_text`()返回最近打開的開始標記中的文本。 結構化處理時通常應該不需要這個,但在處理“已部署”的 HTML 或是在以最小改變來重新生成輸入時可能會有用處(例如可以保留屬性間的空格等)。 下列方法將在遇到數據或者標記元素的時候被調用。他們需要在子類中重載。基類的實現中沒有任何實際操作(除了 [`handle_startendtag()`](#html.parser.HTMLParser.handle_startendtag "html.parser.HTMLParser.handle_startendtag") ): `HTMLParser.``handle_starttag`(*tag*, *attrs*)這個方法在標簽開始的時候被調用(例如: `<div id="main">` )。 *tag* 參數是小寫的標記名。*attrs* 參數是一個 `(name, value)` 形式的列表,包含了所有在標記的 `<>` 括號中找到的屬性。*name* 轉換為小寫,*value* 的引號被去除,字符和實體引用都會被替換。 實例中,對于標簽 `<A HREF="https://www.cwi.nl/">`,這個方法將以下列形式被調用 `handle_starttag('a', [('href', 'https://www.cwi.nl/')])` 。 [`html.entities`](html.entities.xhtml#module-html.entities "html.entities: Definitions of HTML general entities.") 中的所有實體引用,會被替換為屬性值。 `HTMLParser.``handle_endtag`(*tag*)此方法被用來處理元素的結束標記(例如: `</div>` )。 *tag* 參數是小寫的標簽名。 `HTMLParser.``handle_startendtag`(*tag*, *attrs*)類似于 [`handle_starttag()`](#html.parser.HTMLParser.handle_starttag "html.parser.HTMLParser.handle_starttag"), 只是在解析器遇到 XHTML 樣式的空標記時被調用( `<img ... />`)。這個方法能被需要這種特殊詞法信息的子類重載;默認實現僅簡單調用 [`handle_starttag()`](#html.parser.HTMLParser.handle_starttag "html.parser.HTMLParser.handle_starttag") 和 [`handle_endtag()`](#html.parser.HTMLParser.handle_endtag "html.parser.HTMLParser.handle_endtag") 。 `HTMLParser.``handle_data`(*data*)這個方法被用來處理任意數據(例如:文本節點和 `<script>...</script>` 以及 `<style>...</style>` 中的內容)。 `HTMLParser.``handle_entityref`(*name*)這個方法被用于處理 `&name;` 形式的命名字符引用(例如 `>`),其中 *name* 是通用的實體引用(例如: `'gt'`)。如果 *convert\_charrefs* 為 `True`,該方法永遠不會被調用。 `HTMLParser.``handle_charref`(*name*)這個方法被用來處理 `&#NNN;` 和 `&#xNNN;` 形式的十進制和十六進制字符引用。例如,`>` 等效的十進制形式為 `>` ,而十六進制形式為 `>` ;在這種情況下,方法將收到 `'62'` 或 `'x3E'` 。如果 *convert\_charrefs* 為 `True` ,則該方法永遠不會被調用。 `HTMLParser.``handle_comment`(*data*)這個方法在遇到注釋的時候被調用(例如: `\<!--comment-->` )。 例如, `\<!-- comment -->` 這個注釋會用 `' comment '` 作為參數調用此方法。 Internet Explorer 條件注釋(condcoms)的內容也被發送到這個方法,因此,對于 `\<!--[if IE 9]>IE9-specific content<![endif]-->` ,這個方法將接收到 `'[if IE 9]>IE9-specific content<![endif]'` 。 `HTMLParser.``handle_decl`(*decl*)這個方法用來處理 HTML doctype 申明(例如 `` )。 *decl* 形參為 `<!...>` 標記中的所有內容(例如: `'DOCTYPE html'` )。 `HTMLParser.``handle_pi`(*data*)此方法在遇到處理指令的時候被調用。*data* 形參將包含整個處理指令。例如,對于處理指令 `<?proc color='red'>` ,這個方法將以 `handle_pi("proc color='red'")` 形式被調用。它旨在被派生類重載;基類實現中無任何實際操作。 注解 [`HTMLParser`](#html.parser.HTMLParser "html.parser.HTMLParser") 類使用 SGML 語法規則處理指令。使用 `'?'` 結尾的 XHTML 處理指令將導致 `'?'` 包含在 *data* 中。 `HTMLParser.``unknown_decl`(*data*)當解析器讀到無法識別的聲明時,此方法被調用。 *data* 形參為 `<![...]>` 標記中的所有內容。某些時候對派生類的重載很有用。基類實現中無任何實際操作。 ## 示例 下面的類實現了一個解析器,用于更多示例的演示: ``` from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): print("Start tag:", tag) for attr in attrs: print(" attr:", attr) def handle_endtag(self, tag): print("End tag :", tag) def handle_data(self, data): print("Data :", data) def handle_comment(self, data): print("Comment :", data) def handle_entityref(self, name): c = chr(name2codepoint[name]) print("Named ent:", c) def handle_charref(self, name): if name.startswith('x'): c = chr(int(name[1:], 16)) else: c = chr(int(name)) print("Num ent :", c) def handle_decl(self, data): print("Decl :", data) parser = MyHTMLParser() ``` 解析一個文檔類型聲明: ``` >>> parser.feed('') Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" ``` 解析一個具有一些屬性和標題的元素: ``` >>> parser.feed('<img src="python-logo.png" alt="The Python logo">') Start tag: img attr: ('src', 'python-logo.png') attr: ('alt', 'The Python logo') >>> >>> parser.feed('<h1>Python</h1>') Start tag: h1 Data : Python End tag : h1 ``` `script` 和 `style` 元素中的內容原樣返回,無需進一步解析: ``` >>> parser.feed('<style type="text/css">#python { color: green }</style>') Start tag: style attr: ('type', 'text/css') Data : #python { color: green } End tag : style >>> parser.feed('<script type="text/javascript">' ... 'alert("<strong>hello!</strong>");</script>') Start tag: script attr: ('type', 'text/javascript') Data : alert("<strong>hello!</strong>"); End tag : script ``` 解析注釋: ``` >>> parser.feed('<!-- a comment -->' ... '<!--[if IE 9]>IE-specific content<![endif]-->') Comment : a comment Comment : [if IE 9]>IE-specific content<![endif] ``` 解析命名或數字形式的字符引用,并把他們轉換到正確的字符(注意:這 3 種轉義都是 `'>'` ): ``` >>> parser.feed('>>>') Named ent: > Num ent : > Num ent : > ``` 填充不完整的塊給 [`feed()`](#html.parser.HTMLParser.feed "html.parser.HTMLParser.feed") 執行,[`handle_data()`](#html.parser.HTMLParser.handle_data "html.parser.HTMLParser.handle_data") 可能會多次調用(除非 *convert\_charrefs* 被設置為 `True` ): ``` >>> for chunk in ['<sp', 'an>buff', 'ered ', 'text</s', 'pan>']: ... parser.feed(chunk) ... Start tag: span Data : buff Data : ered Data : text End tag : span ``` 解析無效的 HTML (例如:未引用的屬性)也能正常運行: ``` >>> parser.feed('<p><a class=link href=#main>tag soup</p ></a>') Start tag: p Start tag: a attr: ('class', 'link') attr: ('href', '#main') Data : tag soup End tag : p End tag : a ``` ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](html.entities.xhtml "html.entities --- HTML 一般實體的定義") | - [上一頁](html.xhtml "html --- 超文本標記語言支持") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 標準庫](index.xhtml) ? - [結構化標記處理工具](markup.xhtml) ? - $('.inline-search').show(0); | ? [版權所有](../copyright.xhtml) 2001-2019, Python Software Foundation. Python 軟件基金會是一個非盈利組織。 [請捐助。](https://www.python.org/psf/donations/) 最后更新于 5月 21, 2019. [發現了問題](../bugs.xhtml)? 使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 創建。
                  <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>

                              哎呀哎呀视频在线观看