パンダの休日

雑多な書き残し

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Webサイトから情報を拾ってくることをスクレイピングと言うらしいです。
何かの役に立ちそうなので調べながら試作。

スクレイピングで検索すれば色々見つかるんですが外部ライブラリを使っているものが多かったのでPure Pythonだけで作ってみます。
今回からPython3.4.1に移行しましたが3.2以上なら同様に動くはずです。
まずは目的のサイトからHTMLデータをurllib.requesの.urlopenで取得します。
urllib.request.urlopenはバイト文字列で拾ってくるのでParserで使いやすいように.decode()でユニコードにした方が良さげです。
次にこのデータをHTMLParserに渡して解析します。
HTMLParserはHTMLの開始タグ・中身・終了タグを見つけてhandle_ナントカ(略)を呼び出すようなのでそれに合わせて関数を作ります。
それで、それを、何か、こう、工夫して目的のデータを拾います。
以下では気象庁の天気予報の都道府県別のページの天気を示す画像のタイトルを抜き出しています。

import urllib.request
from html.parser import HTMLParser

class MyParser(HTMLParser):

def __init__(self):
HTMLParser.__init__(self)
self.STA = [0,0,0]
#[階層の深さ,条件を満たした時の階層,表示した回数]

def handle_starttag(self, tagname, attrs):
self.STA[0] += 1
if len(attrs) and (attrs[0][1] == "weather") and self.STA[2]<2:
self.STA[1] = self.STA[0]
if len(attrs) and self.STA[0] == self.STA[1]+2:
print(attrs[2][1])
self.STA[2] += 1
self.STA[1] = 0

def handle_endtag(self, tagname):
self.STA[0] -= 1

def handle_data(self, data):
if 0 < self.STA[1] == self.STA[0]:
print(data+":", end="")


def weather():
data = urllib.request.urlopen("http://www.jma.go.jp/jp/yoho/331.html")
htmldata = data.read().decode() #data.read()はバイト文字列を返してくるのでユニコードへ
par = MyParser()
print("大阪:")
par.feed(htmldata)

weather()
スポンサーサイト

shader

Author:shader
多趣味飽き性に振り回されて色々やってます。

直接連絡したい方は御気軽にメールしてください。 3日以内には返信させて頂きます。

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。