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 # <body/>
lxml.etreeのElementインスタンスから生成することもできます。
d3 = pq(url='https://google.co.jp/')
print d3 # 指定したページのソースが表示される
URLをもとに生成することなんかもできます。
さらに、「filename」キーワードを使えば、ローカルのHTMLファイルから生成することもできるようです。このあたりの詳しいところは、ソースの該当部分をごらんいただくのがよいかと思います。
02 オブジェクトの操作: 子要素の追加
d2.append(d1)
print d2 # d2の子としてd1が追加される
append()やprepend()を使うと、PyQueryインスタンスに子要素を追加することができます。
d2.prepend(pq('<header/&>')) # d2の子の先頭にheaderが追加される
d2.append(pq('<div>')) # d2の子の末尾にdivが追加される
d2.append(pq('<footer/&>')) 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よりも実行形式のインストーラを使うのがおすすめです。