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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 8.3.?從 HTML 文檔中提取數據 為了從 HTML 文檔中提取數據,將 `SGMLParser` 類進行子類化,然后對想要捕捉的標記或實體定義方法。 從 HTML 文檔中提取數據的第一步是得到某個 HTML 文件。如果在您的硬盤里存放著 HTML 文件,您可以使用[處理文件的函數](../file_handling/file_objects.html "6.2.?與文件對象共事")將它讀出來,但是真正有意思的是從實際的網頁得到 HTML。 ## 例?8.5.?`urllib` 介紹 ``` >>> import urllib >>> sock = urllib.urlopen("http://diveintopython.org/") >>> htmlSource = sock.read() >>> sock.close() >>> print htmlSource <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><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'> <link rev='made' href='mailto:mark@diveintopython.org'> <meta name='keywords' content='Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free'> <meta name='description' content='a free Python tutorial for experienced programmers'> </head> <body bgcolor='white' text='black' link='#0000FF' vlink='#840084' alink='#0000FF'> <table cellpadding='0' cellspacing='0' border='0' width='100%'> <tr><td class='header' width='1%' valign='top'>diveintopython.org</td> <td width='99%' align='right'><hr size='1' noshade></td></tr> <tr><td class='tagline' colspan='2'>Python&nbsp;for&nbsp;experienced&nbsp;programmers</td></tr> [...略...] ``` | | | | --- | --- | | \[1\] | `urllib` 模塊是標準 Python 庫的一部分。它包含了一些函數,可以從基于互聯網的 URL (主要指網頁) 來獲取信息并且真正取回數據。 | | \[2\] | `urllib` 模塊最簡單的使用是提取用 `urlopen` 函數取回的網頁的整個文本。打開一個 URL 同[打開一個文件](../file_handling/file_objects.html "6.2.?與文件對象共事")相似。`urlopen` 的返回值是像文件一樣的對象,它具有一個文件對象一樣的方法。 | | \[3\] | 使用由 `urlopen` 所返回的類文件對象所能做的最簡單的事情就是 `read`,它可以將網頁的整個 HTML 讀到一個字符串中。這個對象也支持 `readlines` 方法,這個方法可以將文本按行放入一個列表中。 | | \[4\] | 當用完這個對象,要確保將它 `close`,就如同一個普通的文件對象。 | | \[5\] | 現在我們將 `http://diveintopython.org/` 主頁的完整的 HTML 保存在一個字符串中了,接著我們將分析它。 | ## 例?8.6.?`urllister.py` 介紹 如果您還沒有下載本書附帶的樣例程序, 可以 [下載本程序和其他樣例程序](http://www.woodpecker.org.cn/diveintopython/download/diveintopython-exampleszh-cn-5.4b.zip "Download example scripts")。 ``` from sgmllib import SGMLParser class URLLister(SGMLParser): def reset(self): SGMLParser.reset(self) self.urls = [] def start_a(self, attrs): href = [v for k, v in attrs if k=='href'] if href: self.urls.extend(href) ``` | | | | --- | --- | | \[1\] | `reset` 由 `SGMLParser` 的 `__init__` 方法來調用,也可以在創建一個分析器實例時手工來調用。所以如果您需要做初始化,在 `reset` 中去做,而不要在 `__init__` 中做。這樣當某人重用一個分析器實例時,可以正確地重新初始化。 | | \[2\] | 只要找到一個 `&lt;a&gt;` 標記,`start_a` 就會由 `SGMLParser` 進行調用。這個標記可以包含一個 `href` 屬性,或者包含其它的屬性,如 `name` 或 `title`。`attrs` 參數是一個 tuple 的 list,`[(_attribute_, _value_), (_attribute_, _value_), ...]`。或者它可以只是一個有效的 HTML 標記 `&lt;a&gt;` (盡管無用),這時 `attrs` 將是個空 list。 | | \[3\] | 我們可以通過一個簡單的[多變量](../native_data_types/declaring_variables.html#odbchelper.multiassign "3.4.2.?一次賦多值") [list 映射](../native_data_types/mapping_lists.html "3.6.?映射 list")來查找這個 `&lt;a&gt;` 標記是否擁有一個 `href` 屬性。 | | \[4\] | 像 `k=='href'` 的字符串比較是區分大小寫的,但是這里是安全的。因為 `SGMLParser` 會在創建 `attrs` 時將屬性名轉化為小寫。 | ## 例?8.7.?使用 `urllister.py` ``` >>> import urllib, urllister >>> usock = urllib.urlopen("http://diveintopython.org/") >>> parser = urllister.URLLister() >>> parser.feed(usock.read()) >>> usock.close() >>> parser.close() >>> for url in parser.urls: print url toc/index.html #download #languages toc/index.html appendix/history.html download/diveintopython-html-5.0.zip download/diveintopython-pdf-5.0.zip download/diveintopython-word-5.0.zip download/diveintopython-text-5.0.zip download/diveintopython-html-flat-5.0.zip download/diveintopython-xml-5.0.zip download/diveintopython-common-5.0.zip ...略... ``` | | | | --- | --- | | \[1\] | 調用定義在 `SGMLParser` 中的 `feed` 方法,將 HTML 內容放入分析器中。 \[4\] 這個方法接收一個字符串,這個字符串就是 `usock.read()` 所返回的。 | | \[2\] | 像處理文件一樣,一旦處理完畢,您應該 `close` 您的 URL 對象。 | | \[3\] | 您也應該 `close` 您的分析器對象,但出于不同的原因。`feed` 方法不保證對傳給它的全部 HTML 進行處理,它可能會對其進行緩沖處理,等待接收更多的內容。只要沒有更多的內容,就應調用 `close` 來刷新緩沖區,并且強制所有內容被完全處理。 | | \[4\] | 一旦分析器被 `close`,分析過程也就結束了。`parser.urls` 中包含了在 HTML 文檔中所有的鏈接 URL。(如果當您讀到此處發現輸出結果不一樣,那是因為下載了本書的更新版本。) | ## Footnotes \[4\] 像 `SGMLParser` 這樣的分析器,技術術語叫做_消費者 (consumer)_。它消費 HTML,并且拆分它。也許因此就選擇了 `feed` 這個名字,以便同_消費者_ 這個主題相適應。就個人來說,它讓我想象在動物園看展覽。里面有一個黑漆漆的獸穴,沒有樹,沒有植物,沒有任何生命的跡象。但只要您非常安靜地站著,盡可能靠近著瞧,您會看到在遠處的角落里有兩只明眸在盯著您。但是您會安慰自已那不過是心理作用。唯一知道獸穴里并不是空無一物的方法,就是在柵欄上有一個不明顯的標記,上面寫著 “禁止給分析器喂食”。但也許只有我這么想,不管怎么樣,這種心理想象很有意思。
                  <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>

                              哎呀哎呀视频在线观看