在diveintopython網站上,http://diveintopython.org/html_processing/extracting_data.html可以找到一些html處理的例子,比如這個類可以用來擷取html頁面中的href標籤內容。
from sgmllib import SGMLParserclass 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)
將這個檔案href的地方都改成src,start_a改成start_img
即:
from sgmllib import SGMLParser
class URLLister(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.urls = []
def start_img(self, attrs):
src = [v for k, v in attrs if k=='src']
if src:
self.urls.extend(src)
儲存代碼內容為urllister.py檔案,放在python安裝目錄即可,這樣就可以用來分析網頁的圖片地址了。
下面為圖片下載的程式內容
import urllib2
import urllib
import os
import urllister
# 這是來自http://diveintopython.org/html_processing/extracting_data.html#dialect.extract.urllib的一個分析html頁面的類
imagepath=[]
#cd 函數用於判斷路徑是否正確,如正確則改變當前工作路徑
def cd(ss):
try:
os.chdir(ss)
print '改變工作目錄為'+ss
return 0
except:
print '輸入圖片儲存路徑有誤,請重新輸入'
return 1
#addimagepath,該函數將圖片路徑添加到imagepath這個list中
def addimagepath(surl):
if 'http://' in surl
imagepath.append(surl)
print '找到圖片:'+surl.split('/')[-1]+'圖片地址為:'+surl
else:
surl=str_url+surl
imagepath.append(surl)
print '找到圖片:'+surl.split('/')[-1]+'圖片地址為:'+surl
#download images
def image_down(list_image):
if not list_image:
print "該頁面沒有任何圖片"
else:
for image in list_image:
try:
urllib.urlretrieve(image,image.split('/')[-1]) #利用image.split('/')[-1]獲得檔案名稱
print "來自"+image+"的圖片儲存成功!"
except:
print "來自"+image+"圖片沒有儲存成功,繼續儲存下一張圖片...."
print "請輸入網頁的url地址:"
str_url=raw_input()
print "請輸入圖片儲存地址,如果直接斷行符號將預設儲存到我的文件"
temp=1
while temp:
str_save=raw_input()
if not str_save:
str_save='E:/Fei_Doc'
temp=cd(str_save)
try:
sock=urllib2.urlopen(str_url)
print "頁面串連成功!開始擷取圖片地址……"
except:
print "sorry,輸入的地址有誤或頁面無法串連,程式將自動結束"
parser=urllister.URLLister()
parser.feed(sock.read())
sock.close()
parser.close()
for url in parser.urls:
addimagepath(url)
#調用圖片下載函數
image_down(imagepath)
#程式結束
儘管這個程式能基本上解決問題,不過我發現有一些不足:
1、如果頁面的img標籤後面沒有直接跟src屬性,比如複雜一點的img代碼:
<img border="0" onload="
function onload(event) {
javascript:
if (this.width > screen.width - 333) {
this.width = screen.width - 333;
}
}
" src="http://bbs.263.net/forumData/119/2860134_1.jpg" alt="按此在新視窗瀏覽圖片" />
那麼urllister便無法識別了。不過這個問題解決起來比較容易,直接對html代碼每行代碼進行分析,利用split('src'),可以得到所有src標籤的內容,然後根據尾碼是否為jpg,gif等得到圖片檔案地址。
2、上面的程式只是對地址為http開始的圖片以及當前url下面目錄的圖片進行處理,如果src裡面的內容以“../images“ 或者 “/“開頭,則需另外處理。