• 沒有找到結果。

Python 09

N/A
N/A
Protected

Academic year: 2021

Share "Python 09"

Copied!
16
0
0

加載中.... (立即查看全文)

全文

(1)

Python

程式設計

(2)

Outline

u

網頁抓取與解析

u

urllib

(3)

urllib

u urllib這個module,提供一般抓取網頁的工作,可以使用 urlopen函數開啟某個網址,然後將傳回的物件呼叫它的 read函數,取出所有網頁的內容,最後關閉。原本可能會 很複雜的工作全部都已經被包好了

(4)

urllib

u urlopen(),是基於python的open()方法 u urllib.request.urlopen('網址')

u 傳入參數要遵循http、ftp、等網路協議

u urllib.request.urlopen('http://www.yahoo.com.tw')

u 特別注意,協定方式一定要加

u 也可以是本機端的檔案

(5)

讀取網頁內容

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的字串

(6)

HTMLParser

u 是HTML的解析器,不是嚴謹地去解析網頁,它可以處理 像不對稱的HTML語法等等,對於網路上各種千奇百怪出 錯的網頁來說,當然是選擇可以容錯的 Parser比較好 u 其運作方式是這樣,使用者覆載(override)一系列的 handle_xxx函數,例如handle_data就是負責處理非 HTML標籤,也就是不在<>的那些字用的方法,當它分析 到這樣的資料就會呼叫handle_data,所以覆載了這個函數 就可以處理這些資料,如果你希望可以處理 HTML標籤, 你也可以覆載handle_startag等等方法 u 其中xxx表示html tag的類型

(7)

HTMLParser

u from html.parser import HTMLParser u 透過繼承的機制繼承  HTMLParser 類別   u 定義我們自己的網頁原始碼的解析器類別  

u 依需求覆載(override)一系列的 handle_xxx函數, 並實作函式的內容

u 使用自行定義的類別產生出解析器物件實體  

u 透過呼叫feed()方法將傳入的參數進行語法分析    

(8)

可覆載(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)

(9)

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

(10)

範例程式

u EX09_02.py

(11)
(12)

HTMLParser Methods

—

HTMLParser 包含以下的⽅方法

—

HTMLParser.feed(data)

—

HTMLParser.close()

—

HTMLParser.reset()

—

HTMLParser.getpos()

—

HTMLParser.get_starttag_text()

(13)

參考資料

—

http://docs.python.org/3.3/library/html.parser.html?h

ighlight=htmlparser#html.parser.HTMLParser.close

(14)

抓取統一發票範例

u EX09_03.py u 問題1, (下面這種、分隔的字串要怎麼分割出來) u '82267055、72762106、06820335' u 問題2, 擷取到的內容似乎包含兩期對獎的號碼,要怎麼限 制抓取的是某一組 (ex. 最新一期的)

(15)

中文URL的編碼/解碼

u import urllib.parse

u urllib.parse.quote(str)

u 此方法可將str中的字串轉為url編碼

u urllib.parse.unquote(str)

(16)

Homework

u 抓取yahoo!電影的某部電影, 例如: u https://tw.movies.yahoo.com/movieinfo_main.html/id=5644 u 需要抓取的資訊如下: u 電影名稱 (中英) u 上映日期 u 類 型 u 片 長 u 導 演 u 演 員 u 發行公司 u 官方網站 u 劇情介紹 u 將擷取出來的資料存檔,檔名: 編號.txt ,以這部電影為例 存檔為5644.txt

參考文獻

相關文件

[r]

Quadro 2 - Pessoal remunerado, segundo a profissão, por ramo de actividade económica e sexo.. 30/9/2000

A constant state u − is formed on the left side of the initial wave train followed by a right facing (with respect to the velocity u − ) dispersive shock having smaller

Comments on problems with complex equation of state Even for single phase flow case, standard method will fail to attain pressure equilibrium, say, for example, van der Waals gas..

We would like to point out that unlike the pure potential case considered in [RW19], here, in order to guarantee the bulk decay of ˜u, we also need the boundary decay of ∇u due to

Os resultados do Inquérito ao Emprego relativos aos períodos anteriores a 2002 foram ajustados de acordo com a revisão das estimativas da população, operada na sequência

O indicador M1 passou a calcular-se pela soma dos valores da Circulação Monetária e Depósitos à Ordem, em virtude de se ter passado a integrar os Depósitos de Poupança

To Us Leaving Senior High School Life. Suddenly, we are about to graduate