Pythonのlxmlモジュールをインストールする

Python

Pythonの勉強のためにYahoo!の検索結果からタイトルとリンクを抽出するPythonスクリプトを作成中です。

検索結果のHTMLを取得するところまでは出来たので、つぎはHTMLから必要なデータだけを抽出します。

ちなみに、こーゆーHTMLから必要なデータを抽出することをHTML解析(HTMLパース)って言うんですね。

この言葉を知らなかったので調べるのに時間が掛かってしまいました…。

スポンサーリンク

HTML解析用のlxmlモジュール

PythonでHTML解析をするには、サードパーティのlxmlモジュールを使うのが便利らしいので、早速インストールします。

その前に、Pythonには便利なpipというパッケージ管理システムがあります。

わたしのMacにはpipがデフォルトでインストールされていましたが、Windowsでは環境によってインストールされていないこともあるようです。

Windowsをお使いのかたは先にpipをインストールしてください。

事前準備(Windowsのみ)

pipをインストールするためにeasy_installというパッケージを使います。

easy_installもMacでは最初からインストールされていましたが、Windowsではコチラも環境によってインストールされていないようです。

Windowsの方はeasy_installも先にインストール。

easy_installとpipのインストールはこちらの記事が参考になります。

pipのインストール

ターミナルを開いて

sudo easy_install pip

これでOK。

pipの基本的な使いかた

使い方コマンド
インストール済のパッケージ一覧を表示pip freeze
パッケージの検索pip search パッケージ名
パッケージのインストールpip install パッケージ名
パッケージのアンインストールpip uninstall パッケージ名

手動でパッケージ管理するより断然便利そうですね。

lxmlのインストール

pipのインストールが出来たら

pip install lxml

でlxmlがインストールできます(ちょっと時間かかります)。

lxmlとxpathで欲しい情報を抽出

lxmlの詳しい使い方はコチラの記事がとても勉強になります。

わたしがやりたいことは「Yahoo!の検索結果からタイトルとリンクを抽出する」ことです。

そのためには検索結果のHTMLからid=”web”となる<div>ブロック内の<a>タグから必要な情報を引っ張ってくる必要があります。

これを実現してくれるメソッドがxpathです。

xpathは

XML Path Language (XPath; XMLパス言語) は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文である。
Wikipediaより

とのことで、XMLに限らず構造化されたマークアップから情報を抽出するためによく使われるみたいです。

ただ、正直Xpathの細かいコトはわからないので(苦笑)、この辺を参考に、習うより慣れろでSublime REPLを使っていろいろ試したところ

xpath("//div[@id='web']//li/a")

このようにxpathを指定することで検索結果の<a>タグのリストが抽出出来ました。

あとは抽出出来たリストからタイトルとリンクを抽出するだけです。

xpathメソッドで返されるオブジェクト(lxml.html.HtmlElement型)には

  • タグの属性値を取得するattribメソッド
  • タグで囲まれたテキストを取得するtext_content()メソッド

があるので、

  • <a>タグのhref属性値をattribメソッドで取得
  • <a>タグで囲まれたテキストをtext_content()メソッドで取得

すれば検索結果とURLのリストが作成できそうです。

ちなみに、テキストを取得するにはtextメソッドというものもあります。

が、コチラはタグが入れ子になってると取得できないので今回は使えませんでした。

最終版

動作確認出来た最終版がコチラになります。

# -*- coding: utf-8 -*-

import urllib2
import lxml.html


def main():

    url = 'http://search.yahoo.co.jp/search?p=[検索ワード]
    &ei=UTF-8'
    request = urllib2.urlopen(url)
    html = unicode(request.read(), 'utf-8')

    dom = lxml.html.fromstring(html)    # HTMLをDOMツリーに

    a_list = dom.xpath("//div[@id='web']//li/a")    # <div id="web">の子要素の<li>の子要素の<>をすべて抽出
    for i, j in enumerate(a_list):
        result = str(i + 1) + '. ['
        result += j.text_content() + ']('   # <a>タグのテキストノード(リンクタイトル)を取得
        result += j.attrib['href'] + ')'    # <a>タグのhref属性値(URL)を取得
        print result

    request.close()

if __name__ == '__main__':
    main()

全て標準モジュールでやろうとするとチョット面倒くさそうでしたが、便利なサードパーティモジュールを使えばあっという間でしたw

Pythonにはこーゆー便利なサードパーティモジュールがたくさんあるのが魅力です。

たいていの情報はネットで探せそうなので、あとは検索テクニックを磨くことがポイントになりそうですw

コメント

タイトルとURLをコピーしました