まめりうむ

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

*

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

   

スポンサーリンク

引き続きPythonドキュメントの日本語訳を読んでます。

チュートリアルを読み終わったあとも順番通り目を通していて、今はPython 言語リファレンスを読んでる途中です。

正直この辺はわたしのような遊びで使う程度の人には不要な気がしますw

性格的に読み飛ばすのがシャクなので一応読んではいるものの、読んでると眠くなるしちょっと飽きてくる

なので、モチベーションを維持するためにちょっとづつPythonスクリプトを書き始めました。

Yahoo!JAPANの検索結果からURLのタイトルとリンクを抽出するPythonスクリプト

まず手始めにYahoo!JAPANの検索結果からURLのタイトルとリンクを抽出するスクリプトを書くことにしました。

ホントはGoogleが良かったんですが、Googleから検索結果を取得するのはちょっとだけ面倒っぽかったので今回は見送りです。

URLからHTMLを取得する

まず、Yahoo!JAPANで検索するときに発行するURLは

http://search.yahoo.co.jp/search?p=[検索ワード]&ei=UTF-8

こんな感じ。

で、PythonでURLからHTMLを取得するスクリプトは2.7系だと

import urllib2

url = 'http://search.yahoo.co.jp/search?p=[検索ワード]&ei=UTF-8'
request = urllib2.urlopen(url) # ファイルオブジェクトを取得
html = unicode(request.read(),'utf-8') # ファイルオブジェクトからHTMLをunicodeで読み込み

これだけ。

エラー処理とか省いてますけど超カンタンですねw

ちなみに、3.0系ではurllib2モジュールがなくなってurllib.requesturllib.errorに分割されてるみたいなので注意です。

あと、4行目でHTMLを取得する時にunicodeに変換してます。

処理中は全てunicodeで統一してた方が良いっぽいのでやってますが、変換しなくてもわりとちゃんと動いたりします。

取得したHTMLを眺めてみる

前のコードでゲットしたhtmlから必要な情報を抽出すれば終わりです。

やりたいことは検索結果のタイトルとリンクを抽出することなので、まずはHTMLの構造を観てみると

<div id="res">
	<div id="web">
		<h2>ウェブ</h2>
		<ol>
			<li><!-- 検索結果(1) -->
				<a href="検索結果(1)のURL">検索結果(1)のタイトル</a>
			</li>
			<div>検索結果(1)の概要</div>
			<em>検索結果(1)のURL</em>
			<li><!-- 検索結果(2) -->
				<a href="検索結果(2)のURL">検索結果(2)のタイトル</a>
			</li>
			<div>検索結果(2)の概要</div>
			<em>検索結果(2)のURL</em>
			<!-- 以下略 -->
		</ol>
	</div>
</div>

こんな感じになってたので、id=”web”の<div>ブロック内にある<a>タグを引っ張ってくれば良さそうです。

問題はココから

id=”web”となる<div>ブロック内の<a>タグから必要な情報を引っ張ってくるための方法で一番最初に思い浮かんだのは正規表現です。

ただ、わたし正規表現が超苦手で全く意味がわからないのでパス。

他に良い方法が無いか調べてみて行きついたのがhtmllibを使う方法。

でも、残念ながらhtmllibは3.0系で削除されているとのことで、将来的には使えなくなりそうなので見送り。

次に考えたのがHTMLParserクラスを継承したクラスで処理する方法。

この方法だと開始タグや終了タグの検出は出来るものの、あるタグで囲まれた文字列を抽出するのはちょっと面倒くさそう。

さらに、今回みたいに<div id=”web”>ブロックに囲まれた<a>タグみたいに細かい条件をつける時はさらに面倒くさそうなのでこの方法も見送り。

結局、標準モジュールでは楽な方法が思い浮かばないのでサードパーティモジュールの手を借りることにしました。

こちらのサイトで紹介されていたlxmlモジュールを使うと、HTMLをXMLツリーを扱うのと同じように処理できるみたいでかなり便利そうです。


ちょっと長くなってしまったので次回はlxmlモジュールのインストールから。

 - プログラミング ,

スポンサーリンク

Message

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

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

  関連記事

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

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

Pythonのwith文

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Pythonの勉強のためにYahoo!の検索結果からタイトルとリンクを抽出するP …

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

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