標籤:相對 協議 類型 映像 sea ase 檔案路徑 new 伺服器
對搜尋引擎、檔案索引、文檔轉換、資料檢索、網站備份或遷移等應用程式來說,經常用到對網頁(即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等。
Python中的urlparse、urllib抓取和解析網頁(一)