python 抓取資料之HTMLParser

來源:互聯網
上載者:User

    最後工作需要到處理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>  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.