ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

【Python2.7】BeautifulSoupで(個人的に)よく使うコードをメモ

スポンサードリンク

といっても、初歩的な初歩なんですけども。。。

準備

from bs4 import BeautifulSoup

これでおk。まだインストールしていないならpipでインストールしてね。

今回はurlからデータを取得してそれをBeautifulSoupへ渡す。

import requests

response = requests.get('http://www.yahoo.co.jp')
soup = BeautifulSoup(response.text)

おk。

ちなみに、htmlファイルをディスクからreadして渡すのもおk。

file_path = 'htmlのファイルパス'
f = open(file_path, 'r')
data = f.read()
f.close()

soup = BeautifulSoup(data)

1つの要素にアクセス

soup.find('div')

あれ・・・? なんもとれねぇ。

ソースみたら、全部テーブルだった。。。まじ?(よくみたら推奨ブラウザみたいなのがありました。普通にブラウジングしたら問題ないはず)

soup.find('table')
# いっぱいhtmlが出力される・・・はず

複数の値を取得する

複数の値を取得したいならfindAllを使う。

# まだbeautifulsoupのオブジェクト
>>> type(soup.find('table'))
<class 'bs4.element.Tag'>

# こっちもそうだけど、こっちはループさせることができる
>>> type(soup.findAll('table'))
<class 'bs4.element.ResultSet'>

複数値がとれたらループすることもできる。そうして子要素にアクセスすることができる。pythonlistとほとんど同じ使い方ができる(と思う)

>>> len(soup.findAll('table'))
25

for table in soup.findAll('table'):
    print table # 何かいっぱいでてくる。。。はず

classなどの属性を指定して検索する

findにはパラメータを渡すことができる。

まずはclassを指定して検索する。

soup.findAll('ul', {'class': 'emphasis'})

こんな感じでdictで渡せばそれを条件に検索してくれる。便利。

もちろんidも使えるし、属性値もいける。

soup.findAll('td', {'align': 'center'})

テキストを取得

BeautifulSoupのオブジェクトで、タグの中にテキストが存在するなら、textで取得することができる。

soup.find('td', {'align': 'center'}).text

# メソッドもある。こっちのほうがいいのかな?
soup.find('td', {'align': 'center'}).getText()

属性値を取得

data-*みたいな属性値にもアクセスできるし、imgタグやaタグのsrcまたはhrefにもアクセスできる。

BeautifulSoupのオブジェクトにdictの要素にアクセスするように指定すればおk.

soup.find('td', {'align': 'center'})['align']
'center'

soup.find('a')['href']
'http://help.yahoo.co.jp/'

soup.find('img')['src']
'http://k.yimg.jp/images/clear.gif'

こんな感じ。

雑感

何度か触る割には本日あまり覚えていなかったのがショックだったのでメモしておきます。。。

過去ログに残っているので最後に触ったのって2年前なのね。。。

www.aipacommander.com

www.aipacommander.com