Yahoo!JAPANの検索結果から欲しい情報だけ抽出するPythonスクリプト

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ツリーを扱うのと同じように処理できるみたいでかなり便利そうです。


ちょっと長くなってしまったので続きはこちらからどうぞ。

コメント

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