ライブラリ: PyQuery

Pythonの「PyQuery」というライブラリについてご紹介します。

from pyquery import PyQuery

「PyQuery」はその名前のとおり、「Python + jQuery」なライブラリ。jQueryのような機能をPython上で提供してくれます。

「$('.myclass')」といったあのシンプルでわかりやすいAPIをPython上でも同じように使うことができます。

以下、基本的な使い方を見ていきます。まずはインスタンスの生成から。

01 PyQueryインスタンスの生成

from lxml import etree
from pyquery import PyQuery as pq

d1 = pq("<div>")
print d1  # <div/>
print type(d1)  # <class 'pyquery.pyquery.PyQuery'>

PyQueryの利用は、PyQueryクラスのインスタンス生成から始まります。「$(タグ名)」でタグ名によって生成することができます。

e = etree.Element("body")
d2 = pq(e)
print d2 &nbsp;# <body/>

lxml.etreeのElementインスタンスから生成することもできます。

d3 = pq(url='https://google.co.jp/')
print d3 &nbsp;# 指定したページのソースが表示される

URLをもとに生成することなんかもできます。

さらに、「filename」キーワードを使えば、ローカルのHTMLファイルから生成することもできるようです。このあたりの詳しいところは、ソースの該当部分をごらんいただくのがよいかと思います。

02 オブジェクトの操作: 子要素の追加

d2.append(d1)
print d2  # d2の子としてd1が追加される

append()やprepend()を使うと、PyQueryインスタンスに子要素を追加することができます。

d2.prepend(pq('<header/&amp>'))    # d2の子の先頭にheaderが追加される
d2.append(pq('<div>'))  # d2の子の末尾にdivが追加される
d2.append(pq('<footer/&amp>'))  d2のこの末尾にfooterが追加される
print d2
# 以下のとおり表示
# <body><header/><div/><div/><footer/></body>

02 オブジェクトの操作: 子要素の取得

for ele in d2.children():
    print ele.tag
# 以下のとおり表示
# header
# div
# div
# footer

要素の子要素はchildren()メソッドで取得することができます。

02 オブジェクトの操作: 子孫要素へのアクセス/内容の編集

d2('div').addClass('article')
d2('.article').text('--- in div ---')

jQueryの「$( )」での要素検索と同じことが、PyQuery上でもできます。$('abc')は要素abcを、%('.abc')はクラスabcを探してきます。

d2('header').addClass('headerA')
d2('.headerA').html('archive')

addClass()、text()、html()といった、jQueryでお馴染みの便利なメソッド群も使うことができます。

02 オブジェクトの操作: CSS属性の編集

d2.attr('color', '#222')
print d2
# 以下のとおり表示
# <body color="#222"><header class="headerA">archive</header>

タグ属性の変更もjQueryと同じ形でできます。

以上です。

厳密にjQueryと同じインタフェースが実現されているわけではありませんが、大方似たような感覚で使えます。jQueryをすでによく知って使っている方にとっては、とっつきやすいライブラリのひとつではないかと思います。

インストール pipがある場合はpipを使うのがよいかと思います。

pip install pyquery

PyQueryの利用には「lxml」というライブラリも必要となりますので、それが入っていなければ事前にインストールしておきましょう。ちなみにlxmlのインストールにはCコンパイラなどが必要とのことで、Windows環境の場合なんかにはpipよりも実行形式のインストーラを使うのがおすすめです。

参考