Python
程式設計
Outline
u
網頁抓取與解析
u
urllib
urllib
u urllib這個module,提供一般抓取網頁的工作,可以使用 urlopen函數開啟某個網址,然後將傳回的物件呼叫它的 read函數,取出所有網頁的內容,最後關閉。原本可能會 很複雜的工作全部都已經被包好了
urllib
u urlopen(),是基於python的open()方法 u urllib.request.urlopen('網址')
u 傳入參數要遵循http、ftp、等網路協議
u urllib.request.urlopen('http://www.yahoo.com.tw')
u 特別注意,協定方式一定要加
u 也可以是本機端的檔案
讀取網頁內容
u 使用read()方法會將所有內容以bytes型態讀取出來 u bytes型態可透過呼叫decode()方法來設定編碼,
並轉成字串型態回傳
u response = urllib.request.urlopen(‘http://invoice.etax.nat.gov.tw/’)
u response.read().decode(‘utf_8’)
u 其中 read() 中可以傳入參數,例如read(10)則會回傳長度10的字串
HTMLParser
u 是HTML的解析器,不是嚴謹地去解析網頁,它可以處理 像不對稱的HTML語法等等,對於網路上各種千奇百怪出 錯的網頁來說,當然是選擇可以容錯的 Parser比較好 u 其運作方式是這樣,使用者覆載(override)一系列的 handle_xxx函數,例如handle_data就是負責處理非 HTML標籤,也就是不在<>的那些字用的方法,當它分析 到這樣的資料就會呼叫handle_data,所以覆載了這個函數 就可以處理這些資料,如果你希望可以處理 HTML標籤, 你也可以覆載handle_startag等等方法 u 其中xxx表示html tag的類型HTMLParser
u from html.parser import HTMLParser u 透過繼承的機制繼承 HTMLParser 類別 u 定義我們自己的網頁原始碼的解析器類別
u 依需求覆載(override)一系列的 handle_xxx函數, 並實作函式的內容
u 使用自行定義的類別產生出解析器物件實體
u 透過呼叫feed()方法將傳入的參數進行語法分析
可覆載(override)的函數
u HTMLParser.handle_starttag(tag, attrs) u HTMLParser.handle_endtag(tag)
u HTMLParser.handle_startendtag(tag, attrs) u HTMLParser.handle_data(data) u HTMLParser.handle_entityref(name) u HTMLParser.handle_charref(name) u HTMLParser.handle_comment(data) u HTMLParser.handle_decl(decl) u HTMLParser.handle_pi(data) u HTMLParser.unknown_decl(data)
Html Tag
類型
u 以下針對常見的 tag 類型做說明: u starttag
u 無屬性(attrs)的如: <head>
u 有包含屬性的: <span class="t18Red">
u 其中屬性會以 [ ("class", "t18Red" ) ] 形式存放內容 u endtag
u </head> u startendtag
u <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
u data
範例程式
u EX09_02.py
HTMLParser Methods
HTMLParser 包含以下的⽅方法
HTMLParser.feed(data)
HTMLParser.close()
HTMLParser.reset()
HTMLParser.getpos()
HTMLParser.get_starttag_text()
參考資料
http://docs.python.org/3.3/library/html.parser.html?h
ighlight=htmlparser#html.parser.HTMLParser.close
抓取統一發票範例
u EX09_03.py u 問題1, (下面這種、分隔的字串要怎麼分割出來) u '82267055、72762106、06820335' u 問題2, 擷取到的內容似乎包含兩期對獎的號碼,要怎麼限 制抓取的是某一組 (ex. 最新一期的)中文URL的編碼/解碼
u import urllib.parse
u urllib.parse.quote(str)
u 此方法可將str中的字串轉為url編碼
u urllib.parse.unquote(str)