PythonでjQuery感覚のセレクタが使えるPyQueryを試してみた

PythonスクレイピングといえばBeautifulSoupを使うのがポピュラーだと思いますが、jQuery風のセレクタを使えるPyQueryというライブラリもあると知ったので試してみました。


思いついたセレクタを適当使ってみた感じ、結構わかりやすくていいかも

# coding=utf-8
from pyquery import PyQuery

q = PyQuery(u"""
<a id="top_link" class="current" href="/">トップへ</a>
<a id="recent_link" href="/recent">最近のエントリ</a>
<a id="popular_link" href="/popular">人気のエントリ</a>
""")

# id
assert len(q('a#recent_link')) == 1
assert q('a#recent_link').text() == u'最近のエントリ'

# class
assert len(q('a.current')) == 1
assert q('a.current').text() == u'トップへ'

# :first
assert len(q('a:first')) == 1
assert q('a:first').text() == u'トップへ'

# :last
assert len(q('a:last')) == 1
assert q('a:last').text() == u'人気のエントリ'

# :even
assert len(q('a:even')) == 2
assert q('a:even').text() == u'トップへ 人気のエントリ'

# :odd
assert len(q('a:odd')) == 1
assert q('a:odd').text() == u'最近のエントリ'

# :gt
assert len(q('a:gt(0)')) == 2
assert q('a:gt(0)').text() == u'最近のエントリ 人気のエントリ'

# :lt
assert len(q('a:lt(1)')) == 1
assert q('a:lt(1)').text() == u'トップへ'

# :eq
assert len(q('a:eq(2)')) == 1
assert q('a:eq(2)').text() == u'人気のエントリ'

上記の例だと文字列をPyQueryに渡してますが、urlを渡すとドキュメントを取ってきてくれます

# coding=utf-8
from pyquery import PyQuery

q = PyQuery('http://d.hatena.ne.jp/yuheiomori0718/')
assert q('h1 > a:first').text() == 'brainstorm'