[Python] crawler func HTMLParser
承襲前篇的 submitter ,這篇就來講一下如何看送出去的結果。
我們要做的就是抓取網頁,然後分析出其中我們要的資料,然後簡潔的 show 出來。
廢話不多說,先引入函式庫。
import urllib2 # 一樣,抓網頁用的
from HTMLParser import HTMLParser #分析字串用的
接下來,來實作一下 Parser 繼承剛剛引入的 HTMLParser 類別。
HTMLPraser 中,我使用其中三個 method 就能完成這項任務,主要是實作這三個函式。(其他函式)
def handle_starttag(self , tag , attrs)
# 他會讀到開頭的tag , tag 是 html tag 類型 如 h1 , td , div ; attrs 是個 list 裡面有 屬性 map 值的關係
def handle_data(self , data)
# 他會讀到 開頭的 tag 和 結尾的 tag 之間的內容 ,
# 但由於沒有 tag 變數可供辨別,所以我用上面的 starttag 立個 flag
def handle_endtag(self , tag)
# 就是讀到結尾的 tag
先繼承HTMLParser類別
class rsParser(HTMLParser):
建構子來個初始化
def __init__(self):
HTMLParser.__init__(self) #呼叫父類別物件建構子
self.getData = False
self.lastTag = ""
self.probID = ""
實作 handle_starttag 函式
def handle_starttag(self , tag , attrs):
self.lastTag = tag # 為 handle_data 立 flag
if tag == "td":
for(attr , value) in attrs: # 算是從 map List 中 解開 map 拿出來用
if attr == 'id':
print value , " " ,
if attr == 'width' and value == '12%':
self.getData = True # 確認是我要的 table
if attr == 'width' and value == '40%': #立 flag 讓 handle_data 取
self.probID = True
實作 handle_data 函式
def handle_data(self , data):
if self.getData == True:
if self.lastTag == 'td':
if data.strip() != "": # strip 去除頭尾的空白
print data.strip() , " " ,
if self.lastTag == 'span':
if data.strip() != "":
print data.strip() , " " ,
實作 handle_endtag 函式
def handle_endtag(self , tag):
if tag == 'td' and self.getData == True: # 取下 flag
print ""
self.getData = False
if tag == 'td' and self.probID == True:
self.probID = False
最後來抓資料餵進 自定義 Parser 值得一提的是 python 並沒有像 C ,JAVA 特別去定義 main , 因此會將整份 code 當 main 跑過一遍 ,
如果 import 一個庫時,就有可能會執行到它只要當作 main 的部分 ,可是我們要的僅是 Class,就會發生非預期的執行。所以為了解決這個問題,需要調用 python 的一個變數
__name__ ,他會定義 .py 檔的狀態。
if __name__ == '__main__':
req = urllib2.Request(status_url)
response = urllib2.urlopen(req)
page = response.read() #Get html file
RSP = rsParser()
RSP.feed(page)
my code : checker ,另外也寫了個查詢英文簡寫的小程式 abbreviate-helper,用於變數命名。
留言
張貼留言