使用Python中的urlparse、urllib抓取和解析網頁(一)

對搜索引擎、文件索引、文檔轉換、數據檢索、站點備份或遷移等應用程序來說,經常用到對網頁(即HTML文件)的解析處理。事實上,通過Python語言提供的各種模塊,我們無需藉助Web服務器或者Web瀏覽器就能夠解析和處理HTML文檔。本文將詳細介紹如何利用Python抓取和解析網頁。首先,我們介紹一個可以幫助簡化打開位於本地和Web上的HTML文檔的Python模塊,然後,我們論述如何使用Python模塊來迅速解析在HTML文件中的數據,從而處理特定的內容,如鏈接、圖像和Cookie等。最後,我們會給出一個規整HTML文件的格式標籤的例子,通過這個例子您會發現使用python處理HTML文件的內容是非常簡單的一件事情。

一、解析URL

通過Python所帶的urlparse模塊,我們能夠輕鬆地把URL分解成元件,之後,還能將這些元件重新組裝成一個URL。當我們處理HTML 文檔的時候,這項功能是非常方便的。

複製代碼
  import urlparse

  parsedTuple = urlparse.urlparse(

  "http://www.google.com/search?

  hl=en&q=urlparse&btnG=Google+Search")

  unparsedURL = urlparse.urlunparse((URLscheme, \

  URLlocation, URLpath, '', '', ''))

  newURL = urlparse.urljoin(unparsedURL,

  "/module-urllib2/request-objects.html")
複製代碼

  函數urlparse(urlstring [, default_scheme [, allow_fragments]])的作用是將URL分解成不同的組成部分,它從urlstring中取得URL,並返回元組 (scheme, netloc, path, parameters, query, fragment)。注意,返回的這個元組非常有用,例如可以用來確定網絡協議(HTTP、FTP等等 )、服務器地址、文件路徑,等等。

  函數urlunparse(tuple)的作用是將URL的組件裝配成一個URL,它接收元組(scheme, netloc, path, parameters, query, fragment)後,會重新組成一個具有正確格式的URL,以便供Python的其他HTML解析模塊使用。

  函數urljoin(base, url [, allow_fragments]) 的作用是拼接URL,它以第一個參數作爲其基地址,然後與第二個參數中的相對地址相結合組成一個絕對URL地址。函數urljoin在通過爲URL基地址附加新的文件名的方式來處理同一位置處的若干文件的時候格外有用。需要注意的是,如果基地址並非以字符/結尾的話,那麼URL基地址最右邊部分就會被這個相對路徑所替換。比如,URL的基地址爲Http://www.testpage.com/pub,URL的相對地址爲test.html,那麼兩者將合併成http://www.testpage.com/test.html,而非http://www.testpage.com/pub/test.html。如果希望在該路徑中保留末端目錄,應確保URL基地址以字符/結尾。

  下面是上面幾個函數的詳細一點的用法舉例:

複製代碼
  import urlparse

  URLscheme = "http"

  URLlocation = "www.python.org"

  URLpath = "lib/module-urlparse.html"

  modList = ("urllib", "urllib2", \

  "httplib", "cgilib")

  #將地址解析成組件

  print "用Google搜索python時地址欄中URL的解析結果"

  parsedTuple = urlparse.urlparse(

  "http://www.google.com/search?

  hl=en&q=python&btnG=Google+Search")

  print parsedTuple

  #將組件反解析成URL

  print "\反解析python文檔頁面的URL"

  unparsedURL = urlparse.urlunparse( \

  (URLscheme, URLlocation, URLpath, '', '', ''))

  print "\t" + unparsedURL

  #將路徑和新文件組成一個新的URL

  print "\n利用拼接方式添加更多python文檔頁面的URL"

  for mod in modList:

  newURL = urlparse.urljoin(unparsedURL, \

  "module-%s.html" % (mod))

  print "\t" + newURL

  #通過爲路徑添加一個子路徑來組成一個新的URL

  print "\n通過拼接子路徑來生成Python文檔頁面的URL"

  newURL = urlparse.urljoin(unparsedURL,

  "module-urllib2/request-objects.html")

  print "\t" + newURL
複製代碼

  上述代碼的執行結果如下所示:

  用Google搜索python時地址欄中URL的解析結果

複製代碼
  ('http', 'www.google.com', '/search', '',

  'hl=en&q=python&btnG=Google+Search', '')

  反解析python文檔頁面的URL

  http://www.python.org/lib/module-urlparse.html

  利用拼接方式添加更多python文檔頁面的URL

  http://www.python.org/lib/module-urllib.html

  http://www.python.org/lib/module-urllib2.html

  http://www.python.org/lib/module-httplib.html

  http://www.python.org/lib/module-cgilib.html

  通過拼接子路徑來生成Python文檔頁面的URL

  http://www.python.org/lib/module-urllib2/request-objects.html
複製代碼

二、打開HTML文檔

  上面介紹瞭如何解析頁面的URL,現在開始講解如何通過URL打開一個網頁。實際上,Python所帶的urllib和urllib2這兩個模塊爲我們提供了從URL打開並獲取數據的功能,當然,這包括HTML文檔。

複製代碼
  import urllib

  u = urllib.urlopen(webURL)

  u = urllib.urlopen(localURL)

  buffer = u.read()

  print u.info()

  print "從%s讀取了%d 字節數據.\n" % (u.geturl(),len(buffer) )
複製代碼

  若要通過urllib模塊中的urlopen(url [,data])函數打開一個HTML文檔,必須提供該文檔的URL地址,包括文件名。函數urlopen不僅可以打開位於遠程web服務器上的文件,而且可以打開一個本地文件,並返回一個類似文件的對象,我們可以通過該對象從HTML文檔中讀出數據。

  一旦打開了HTML文檔,我們就可以像使用常規文件一樣使用read([nbytes])、readline()和readlines()函數來對文件進行讀操作。若要讀取整個HTML文檔的內容的話,您可以使用read()函數,該函數將文件內容作爲字符串返回。

  打開一個地址之後,您可以使用geturl()函數取得被獲取網頁的真正的URL。這是很有用的,因爲urlopen(或使用的opener對象)也許會伴隨一個重定向。獲取的網頁URL也許和要求的網頁URL不一樣。

  另一個常用的函數是位於從urlopen返回的類文件對象中的info()函數,這個函數可以返回URL位置有關的元數據,比如內容長度、內容類型,等等。下面通過一個較爲詳細的例子來對這些函數進行說明。

複製代碼
  import urllib

  webURL = "http://www.python.org"

  localURL = "index.html"

  #通過URL打開遠程頁面

  u = urllib.urlopen(webURL)

  buffer = u.read()

  print u.info()

  print "從%s讀取了%d 字節數據.\n" % (u.geturl(),len(buffer) )

  #通過URL打開本地頁面

  u = urllib.urlopen(localURL)

  buffer = u.read()

  print u.info()

  print "從%s讀取了%d 字節數據.\n" % (u.geturl(),len(buffer) )
複製代碼

上面代碼的運行結果如下所示:

複製代碼
  Date: Fri, 26 Jun 2009 10:22:11 GMT

  Server: Apache/2.2.9 (Debian) DAV/2 SVN/1.5.1 mod_ssl/2.2.9 OpenSSL/0.9.8g mod_wsgi/2.3 Python/2.5.2

  Last-Modified: Thu, 25 Jun 2009 09:44:54 GMT

  ETag: "105800d-46e7-46d29136f7180"

  Accept-Ranges: bytes

  Content-Length: 18151

  Connection: close

  Content-Type: text/html

  從http://www.python.org讀取了18151 字節數據.

  Content-Type: text/html

  Content-Length: 865

  Last-modified: Fri, 26 Jun 2009 10:16:10 GMT

  從index.html讀取了865 字節數據.
複製代碼

三、小結

  對搜索引擎、文件索引、文檔轉換、數據檢索、站點備份或遷移等應用程序來說,經常用到對網頁(即HTML文件)的解析處理。事實上,通過Python語言提供的各種模塊,我們無需藉助Web服務器或者Web瀏覽器就能夠解析和處理HTML文檔。本文中,我們介紹了一個可以幫助簡化打開位於本地和Web上的HTML文檔的Python模塊。在下篇中,我們將論述如何使用Python模塊來迅速解析在HTML文件中的數據,從而處理特定的內容,如鏈接、圖像和Cookie等。

----------------------------------------------------------------------------------------------------------------------

作者:黃聰
出處:http://www.cnblogs.com/huangcong/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章