といっても、初歩的な初歩なんですけども。。。
準備
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'>
複数値がとれたらループすることもできる。そうして子要素にアクセスすることができる。pythonのlist
とほとんど同じ使い方ができる(と思う)
>>> 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年前なのね。。。