pythonでスクレイピング

入門ソーシャルデータにBeautifulSoupを使ってスクレイピングをしている例がありました。
BeautifulSoupはrubyでいうMechanizeやNokogiriに相当するライブラリです。

http://www.crummy.com/software/BeautifulSoup/


初めて使用したので基本的な使い方をメモしておきます

インストール

pip install beautifulsouop

とくに問題なかったです

使用方法

基本は以下のような感じで、urllib2.urlopenでインスタンスを取得してから、それをBeautifulSoupのコンストラクタに渡します

import urllib2
import HTMLParser
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen("http://example.com")
soup = BeautifulSoup(page)

# findAll - aタグのリストを取得
anchorTags = soup.findAll('a')

# 各要素はBeautifulSoup.Tagのインスタンス
tag = anchorTags[0]

# タグ名取得
print(tag.name) # => u'a'

# 属性の有無を取得
print(tag.has_key('href') # => True
print(tag.has_key('rel') # => False

# 属性値を取得
print(tag['href']) # => 'help.txt'
print(tag['rel']) # => KeyError

入門ソーシャルデータではXFNデータをマイニングするのにBeautiulSoupを使ってます。

一部抜粋

anchorTags = soup.findAll('a')

for a in anchorTags:
    if a.has_key('rel'):
        if len(set(a['rel'].split()) & XFN_TAGS) > 0:
            tags = a['rel'].split()
            print a.contents[0], a['href'], tags

findAllでaタグをすべて取得してから、rel属性にXFNの値を持っているタグの情報だけ表示してます。

findAllはキーワード引数を渡すことによって、あらかじめ属性の有無や属性値での絞り込みができますので、以下のように書いても同じです

anchorTags = soup.findAll('a', rel=True)

for a in anchorTags:
    if len(set(a['rel'].split()) & XFN_TAGS) > 0:
        tags = a['rel'].split()
        print a.contents[0], a['href'], tags

キーワード引数の値にTrueを渡すと、属性が設定されていれば返します。

また、キーワード引数の値にcallableなオブジェクトを渡すこともできます。

anchorTags = soup.findAll('a', rel=lambda(value): value and len(set(value.split()) & XFN_TAGS) > 0)
for a in anchorTags:
    print a.contents[0], a['href'], a['rel'].split()


入門 ソーシャルデータ ―データマイニング、分析、可視化のテクニック

入門 ソーシャルデータ ―データマイニング、分析、可視化のテクニック