Regen Techlog

Web・プログラミングの技術メモ

lxmlでスクレイピングするときのコツ

      2017/07/02

python-xml-title

PythonでスクレイピングをしようとするとBeautifulSoup4lxmlを使った例が多くあります。
今回はlxmlでスクレイピングするときのコツをいくつか紹介します。

lxmlはpip install lxmlでインストールできます。

parse()にはURLを直接渡せる

urllibなどを使ってレスポンスをロードしてからlxmlに渡している例が多くありますが、parse()にURLを渡すとそのURLにアクセスして解析してくれます。

>>> import lxml.html
>>> tree = lxml.html.parse('http://example.com/')

base_urlオプションがURLをもとにセットされるので相対リンクを絶対リンクに書き換える際にbase_urlを明示的に渡す必要がなくなります。

XPathをコンパイルして再利用する

同じXPathで複数回検索する場合はコンパイルしておくとパフォーマンスが上がります。
変数を使うこともできます。

>>> count_elements = lxml.etree.XPath('count(//*[local-name() = $name])')
>>> count_elements(tree, name='h1')
1.0
>>> count_elements(tree, name='p')
2.0

文字コードを指定する

lxmlは文字コードをある程度自動で検出してデコードしてくれますが、検出がうまくいかないときは文字コードを指定すればlxml側でデコードも含めてやってくれます。

>>> parser = lxml.html.HTMLParser(encoding='utf-8')
>>> tree = lxml.html.parse('http://example.com/', parser)

ログインが必要なページを取得する

ブラウザのCookieをPythonから利用する」でブラウザのCookieを読み込んでログイン中のセッションをPythonで使う方法を書きました。

サンプル

上記のテクニックを使ったサンプルです。
指定したCDがDISCASで単品レンタル可能か取得します。

 - プログラミング

コメントを残す

  関連記事

WindowsでPython Netifacesをインストールする

Pythonでマジックパケットを監視してみようと思ってプログラムを書いていたので …

Python小ネタ

Pythonの意外と知られていない小ネタを紹介します。

子テーマでサイドバーを最後に追加する

WordPressでテーマをカスタマイズする場合は子テーマを使うのが一般的ですが …

Suspend on LAN

ネットワークに接続されたPCを遠隔で起動する技術にWake on LAN(WoL …

VC++9.0でOpenMP使用時の注意点

OpenMPを使ったCライブラリをPythonで使うためにPython本体のバー …

Pythonで簡単にWindowsサービスを作る

Pythonで書いた処理をバックグラウンドで動かしておきたいときに、Window …

「Unable to find vcvarsall.bat」の対処法

C/C++などのビルドが必要なファイルを含むPythonパッケージをWindow …

browsercookiejar: ブラウザのCookieをPythonから利用する

ウェブスクレイピングの記事を書きましたが、ログインが必要なページから情報を取得す …

THETA画像のEXIF読み取りと傾き補正

最近一部で話題のTHETA(ワンショット全球パノラマカメラ)ですが,THETAを …

SourceTreeのGit-Flowで必ずno-ffする

GUIでGit操作ができるクライアントの一つSourceTreeですが、Git- …