[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,用於變數命名。



留言

這個網誌中的熱門文章

[Antergos] disable touchpad

[Editor] 入坑 Atom => Markdown 轉 PDF