まめりうむ

WindowsからMacへ乗り換るためのネタをまとめたり好きなことをまとめたり。

*

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

   

スポンサーリンク

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

とりあえず検索結果のHTMLを取得するとこまではさっくりと出来て、あとはこのHTMLから必要なデータを抽出するだけ。

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

この単語を知ってればもう少し早く答えが見つかったかも知れません…w

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

Pythonのモジュール管理には専用のパッケージ管理システムpipをインストールするのが良いらしいので、まずはそちらから。

事前準備(Windowsのみ)

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

Macには最初からインストールされてるんですが、Windowsにはインストールされていないため、Windowsでeasy_installするためには事前準備が必要です。

Widowsでeasy_installとpipを使えるようにするためにはコチラの記事が参考になります。

pipのインストール

ターミナルを開いて

sudo easy_install pip

これでOK。

pipのカンタンな使い方

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

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

lxmlのインストール

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

 pip install lxml 

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

lxmlを使って欲しい情報を抽出

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

今回やりたいことを具体的にすると検索結果の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()メソッドがあるので、これを抽出出来たリストに使えば目的達成です。

ちなみに、テキストを取得するには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>の子要素の<a>をすべて抽出
	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

 - プログラミング ,

スポンサーリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

  関連記事

Pythonでニコ生アラートを作る(放送通知サーバへの接続情報を使ってsocket接続)

前回の続きです。 今回は、前回得られた放送通知サーバへの接続情報を使ってsock …

[Python]try~finally文中でreturn文を使ったときの動作

Pythonドキュメントの日本語訳を読んでて気付いたんですが return によ …

Pythonのwith文

このところ興味の矛先がPythonからRaspberry Piに移りつつあります …

Pythonチュートリアルを読みました

Pythonを勉強するにあたって、最初にPythonスタートブックという本を読み …

Pythonでニコ生アラートを作る(放送通知サーバをクラス化する)

前回までのスクリプトでニコ生の放送通知を受け取ることが出来たので、今回はもう少し …

Pythonでニコ生アラートを作る(放送通知サーバのステータス確認と接続情報の取得)

このところプログラミングしたい病が発生していて、ひっそりとPythonでニコ生ア …

サーチエンジンの検索結果から欲しい情報だけ抽出するPythonスクリプト

引き続きPythonドキュメントの日本語訳を読んでます。 チュートリアルを読み終 …

リーダブルコードを読みました

ひょんなことからクオカード1,000円分が手に入ったので、前から読んでみたかった …

Pythonスタートブックを読みました

Sublime Text3きっかけで、前からちょっと触ってみたいなと思ってたスク …

Sublime Text3でPython開発環境を整えるためにインストールしたパッケージと設定

Sublime Text3でPythonのお勉強をするのに役立ちそうなパッケージ …