轉載自:http://tech.it168.com/a2009/0707/601/000000601879_1.shtml
二、從HTML文檔中提取映像
處理HTML文檔的時候,我們常常需要從其中提取出所有的映像。使用HTMLParser模組後,這項任務將變得易如反掌。首先,我們需要定義一個新的HTMLParser類,以覆蓋handle_starttag()方法,該方法的作用是尋找img標籤,並儲存src屬性值所指的檔案。
import HTMLParser
import urllib
def getImage(addr):
u = urllib.urlopen(addr)
data = u.read()
class parseImages(HTMLParser.HTMLParser):
def handle_starttag(self, tag, attrs):
if tag
== 'img':
for name,value
in attrs:
if name
== 'src':
getImage(urlString +
"/"
+ value)
u = urllib.urlopen(urlString)
lParser.feed(u.read())
定義好新的HTMLParser類之後,需要建立一個執行個體來返回HTMLParser對象。然後,就可以使用urllib.urlopen(url)開啟HTML文檔並讀取該HTML檔案的內容了。
為瞭解析HTML檔案的內容並顯示包含其中的映像,可以使用feed(data)函數將資料發送至HTMLParser對象。HTMLParser對象的feed函數將接收資料,並通過定義的HTMLParser對象對資料進行相應的解析。下面是一個具體的樣本:
import HTMLParser
import urllib
import sys
urlString =
"http://www.python.org"
#把影像檔儲存至硬碟
def getImage(addr):
u = urllib.urlopen(addr)
data = u.read()
splitPath = addr.split('/')
fName = splitPath.pop()
print
"Saving %s"
% fName
f = open(fName,
'wb')
f.write(data)
f.close()
#定義HTML解析器
class parseImages(HTMLParser.HTMLParser):
def handle_starttag(self, tag, attrs):
if tag
== 'img':
for name,value
in attrs:
if name
== 'src':
getImage(urlString +
"/"
+ value)
#建立HTML解析器的執行個體
lParser = parseImages()
#開啟HTML檔案
u = urllib.urlopen(urlString)
print
"Opening URL\n===================="
print u.info()
#把HTML檔案傳給解析器
lParser.feed(u.read())
lParser.close()
上述代碼的運行結果如下所示:
Opening URL
====================
Date: Fri, 26 Jun
2009
10:54:49 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
Saving python-logo.gif
Saving trans.gif
Saving trans.gif
Saving afnic.fr.png