萬九郎の硬い船

プログラミング学習記録など

cssのclassを手がかりに要素を取得する

スクレイピングで要素を取得する際に、cssのclassが有効活用できる。 たとえば、このブログ(現状ではWordPressのTwenty Fifteenテーマをそのまま使っている)の記事タイトルだけを抜き出したい場合には、

<h2 class="entry-title">
  <a href="http://mankuro.xyz/blog/.../" rel="bookmark">記事タイトル</a>
</h2>

という構造になっており、entry-titleというclassが指定されたh2要素を取得すればよいので、

html = urlopen("http://mankuro.xyz/blog")
bsObj = BeautifulSoup(html)
titleList = bsObj.findAll("h2", {"class":"entry-title"})
for title in titleList:
    print(title.get_text())

と書けばよい。 BeautifulSoupのfindAll()についてはドキュメントを見てみるとfind_all()にリネームされたようだが(ちなみにPythonのfindallではなくBeautifulSoupのfind_allメソッドであることに注意)、stackoverflowのこのトピックを読む限り、BeautifulSoupのバージョン4を使うのであればどちらでもいいようだ。find_all()の他にfind()というのもある。 get_text()もBeautifulSoupのメソッドで、要素からタグなどを取り除いてテキスト部分だけを抜き出すことができる。 より厳密に要素を特定できるように、なるべくタグの属性を手がかりにするようにしたほうがいいとのこと。