最後工作需要到處理html的資料的問題,然後使用HTMLParser,網上找了很多資料都是千篇一律的。
在這裡記錄下自己的成果,希望對你有用。
1。首先還是讓我們來瞭解一下HTMLParser.
python模組之HTMLParser: 解析html,擷取url HTMLParser是python用來解析html的模組。
它可以分析出html裡面的標籤、資料等等,是一種處理html的簡便途徑。 HTMLParser採用的是一種事件驅動的模式,
當HTMLParser找到一個特定的標記時,它會去調用一個使用者定義的函數,以此來通知程式處理。
它主要的使用者回呼函數的命名都是以handler_開頭的,都是HTMLParser的成員函數。
當我們使用時,就從HTMLParser派生出新的類,然 後重新定義這幾個以handler_開頭的函數即可。
這幾個函數包括:
handle_startendtag 處理開始標籤和結束標籤
handle_starttag 處理開始標籤,
handle_endtag 處理結束標籤,
handle_charref 處理特殊字元串,就是以&#開頭的,一般是內碼錶示的字元
handle_entityref 處理一些特殊字元,以&開頭的,比如 handle_data 處理資料,就是data中間的那些資料 handle_comment 處理注釋 ,
handle_decl 處理<!開頭的,
比如的東西 這裡我以從網頁中擷取到url為例,介紹一下。要想擷取到url,肯定是要分析標籤,然後取到它的href屬性的值。
MyHTMLParser.py
'''<br />Created on 2011-1-11<br />@author: wangtao0422@gmail.com<br />'''<br />from HTMLParser import HTMLParser<br />class MyHTMLParser(HTMLParser):<br /> def __init__(self):<br /> HTMLParser.__init__(self)<br /> self.flag = 0<br /> self.links = []<br /> self.title=""<br /> self.img=""<br /> self.content=""</p><p> def handle_starttag(self, tag, attrs):<br /> #print "Encountered the beginning of a %s tag" % tag<br /> if tag == "a":<br /> if len(attrs) == 0: pass<br /> else:<br /> for (variable, value) in attrs:<br /> if variable == "href":<br /> self.links.append(value)<br />
前調用代碼:start.py
'''<br />Created on 2011-1-11<br />@author: wangtao0422@gmail.com<br />'''<br />import re<br />import urllib<br />from MyHTMLParser import MyHTMLParser</p><p>if __name__ == "__main__":<br /> data=urllib.urlopen(r'http://gy.58.com/duanzu/3934202413954x.shtml').read().decode('utf-8')<br /> hp = MyHTMLParser()<br /> hp.feed(data)<br /> hp.close()<br /> for link in hp.links:<br /> print link</p><p>
以一代碼就是定義的一個我們一個自己的HTML處理類。這代碼也是官方上的。其中測試連結,只做測試使用,不負法律責任
2.如果我們想要提取一段HTML裡面的文本資料怎麼辦呢
首先我們應該要使用handle_data 處理資料。但它又是隨機文本,所以我們要在handle_starttag 遇到這個標記的時候,做個標記,然後
在handle_data 中遇到此標記時,把資料傳出來。
比如我們需要擷取title的文本值,那麼我們的代碼如下
'''<br />Created on 2011-1-11<br />@author: wangtao0422@gmail.com<br />'''<br />from HTMLParser import HTMLParser<br />class MyHTMLParser(HTMLParser):<br /> def __init__(self):<br /> HTMLParser.__init__(self)<br /> self.flag = 0<br /> self.links = []<br /> self.title=""</p><p> def handle_starttag(self, tag, attrs):<br /> #print "Encountered the beginning of a %s tag" % tag<br /> if tag == "a":<br /> if len(attrs) == 0: pass<br /> else:<br /> for (variable, value) in attrs:<br /> if variable == "href":<br /> self.links.append(value)</p><p> if tag =="title":<br /> self.flag=1</p><p> def handle_data(self,data):<br /> if self.flag == 1 and len(self.title)==0:<br /> self.title=data<br /> self.flag==0</p><p>
'''<br />Created on 2011-1-11<br />@author: wangtao0422@gmail.com<br />'''<br />import re<br />import urllib<br />from MyHTMLParser import MyHTMLParser</p><p>if __name__ == "__main__":<br /> data=urllib.urlopen(r'http://gy.58.com/duanzu/3934202413954x.shtml').read().decode('utf-8')<br /> hp = MyHTMLParser()<br /> hp.feed(data)<br /> hp.close()<br /> print hp.title<br /> for link in hp.links:<br /> print link</p><p>
其它節點取文本就類似了
下面是我工作中用到的一段指令碼:
'''<br />Created on 2011-1-11<br />@author: wangt@72ec.com<br />'''<br />import re<br />from HTMLParser import HTMLParser<br />class MyHTMLParser(HTMLParser):<br /> def __init__(self):<br /> HTMLParser.__init__(self)<br /> self.flag = 0 # lable flag<br /> self.content_flag= 0 #content flag<br /> self.links = []<br /> self.title=""<br /> self.img=""<br /> self.content=""</p><p> def handle_starttag(self, tag, attrs):<br /> #print "Encountered the beginning of a %s tag" % tag<br /> if tag == "a":<br /> if len(attrs) == 0: pass<br /> else:<br /> for (variable, value) in attrs:<br /> if variable == "href":<br /> self.links.append(value)</p><p> if tag == "ul":<br /> if len(attrs)==0:pass<br /> else:<br /> for(varviable,value) in attrs:<br /> if varviable=="class" and (value=="info" or value=="description"):<br /> self.flag=3<br /> self.content_flag=1<br /> if tag == "div":<br /> if len(attrs)==0:pass<br /> else:<br /> for(varviable,value) in attrs:<br /> if varviable=="class":<br /> if value=="content" or value=="description" or value=="conleft":<br /> self.flag=3<br /> self.content_flag=1<br /> if tag=="meta":<br /> if len(attrs)==0:pass<br /> else:<br /> for (variable,value) in attrs:<br /> if variable=="content":<br /> pass#self.title=value<br /> if tag=="title":<br /> self.flag=1</p><p> if tag=="img":<br /> if len(attrs)==0:pass<br /> else:<br /> img_host=u'http://pic.58.com/'<br /> for(variable,value) in attrs:<br /> if variable=="src" and img_host in value:<br /> if self.img=="":<br /> self.img=value<br /> if tag=="p":<br /> if self.flag==3:<br /> self.flag=2<br /> if tag=="br":<br /> if self.content_flag==1:<br /> self.flag=2</p><p> def handle_endtag(self, tag):<br /> if tag=="p":<br /> if self.content_flag==1:<br /> self.content_flag=0</p><p> def handle_data(self,data):<br /> if self.flag==1:<br /> self.title=data<br /> self.flag=0<br /> if self.flag==2:<br /> self.content+=data<br /> self.flag=0</p><p>