Friday, February 03, 2006
urllib2結合re的應用
如果你有個list的結構如下:
L=['index.html', 'preface.html', 'd0e34.html', 'd0e37.html', 'd0e44.html', 'consul ting.html', 'consulting.html', 'preface.html', 'preface.html', 'Audience.html', 'ChangesThirdEd.html', 'Acknowledgement.html', 'ToolsPart.html', 'intro.html', ' intro.html', 'OnlineResources.html', 'XSLprocessors.html', 'XSLprocessors.html', 'FOprocessors.html', 'Portability.html', 'ToolsSetup.html', 'ToolsSetup.html', 'ToolsSetup.html', 'ToolsSetup.html', 'ToolsSetup.html', 'InstallStylesheets.htm l', 'InstallingAProcessor.html']
也就是說,有些值是duplicated,這時該怎何將此list的資料結構purified?
這可以應用在存取網路文件資料的範例中,例如在http://www.sagehill.net/docbookxsl,上頭有很多有用的文章,但它是以html的方式存在,並不是單一的檔案(如pdf的格式),這對於如果想要讀取文件,但總是需要到同一網站來進行online方式的閱讀,最好的方式是將之全數下載,但對於python,要用何方式,來作到呢?
利用urllib2中的urlopen可以幫我們作到這一點。
#!/usr/bin/env python
from urllib2 import urlopen
from re import findall
from os import system, stat
def Purified(List):
Temp=[]
for value in List:
if not Temp.count(value): Temp.append(value)
return Temp
def RetDocxsl():
try:
SageFlag=stat('sagehill')
if not SageFlag[6]:
data=urlopen('http://www.sagehill.net/docbookxsl/').read()
Webpages=findall('(.*?.html)',data)
Webpages=Purified(Webpages)
for page in Webpages:
system('wget --no-clobber http://63.249.72.176/docbookxsl/%(page)s'%vars())
#system('wget --no-clobber http://www.sagehill.net/docbookxsl/%(page)s'%vars())
else:
data=open('sagehill').read()
Webpages=findall('(.*?.html)',data)
for page in Webpages:
system('wget --no-clobber http://63.249.72.176/docbookxsl/%(page)s'%vars())
except:
data=urlopen('http://www.sagehill.net/docbookxsl/').read()
open('sagehill'),write(data)
Webpages=findall('(.*?.html)',data)
for page in Webpages:
system('wget --no-clobber http://63.249.72.176/docbookxsl/%(page)s'%vars())
if __name__=='__main__':
RetDocxsl()
以上的程式碼,是利用urlopen將網址內容(index.html)讀取,並將文件內容存取成檔案(檔名為sagehill,方便下次來進行存取),然後用re來parse所需要的文件網址位置。
利用wget來捉取檔案(--no-clobber選項的目的是,如果系統內有重複的檔案,就不要捉取具有相同檔名的文件,wget會略過,以利捉取檔案的速度)。
若是不用--no-clobber的選項,就要讓List中的檔案項目單一化(purified),這一點也可以化作讀者的作業習題?!
此時可以利用getopt的方法,讓網址由getopt的選項,傳入去程式裡,使得程式本身更有彈性,加上利用urlparse,使得網址可以方便地找出來。這方面的便利性,可以作為程式改良的思考方向。
延伸問題: 如果是在windows中,沒有wget這個方便的util,如何用python幫忙將網頁資料取回??
>>> urlparse.urlparse('http://www.sagehill.net/docbookxsl/')
('http', 'www.sagehill.net', '/docbookxsl/', '', '', '')