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/', '', '', '')

Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?