Pythonの勉強のためにYahoo!の検索結果からタイトルとリンクを抽出するPythonスクリプトを作成中です。
検索結果のHTMLを取得するところまでは出来たので、つぎはHTMLから必要なデータだけを抽出します。
ちなみに、こーゆーHTMLから必要なデータを抽出することをHTML解析(HTMLパース)って言うんですね。
この言葉を知らなかったので調べるのに時間が掛かってしまいました…。
HTML解析用のlxmlモジュール
PythonでHTML解析をするには、サードパーティのlxmlモジュールを使うのが便利らしいので、早速インストールします。
その前に、Pythonには便利なpipというパッケージ管理システムがあります。
わたしのMacにはpipがデフォルトでインストールされていましたが、Windowsでは環境によってインストールされていないこともあるようです。
事前準備(Windowsのみ)
pipをインストールするためにeasy_installというパッケージを使います。
easy_installもMacでは最初からインストールされていましたが、Windowsではコチラも環境によってインストールされていないようです。
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
色んなモジュールをインストールして環境を汚すのはイヤという方にはDockerがオススメです。
Dockerコンテナを使うだけならネットで調べた情報で問題ないんですけど、
- Dockerイメージとコンテナの違いってなに?
- Dockerイメージってどんなのがあるの?
- 自分でDockerコンテナ作るにはどうしたらいいの?
とか、ちょっと突っ込んだ情報は調べてもよくわからなかったんですよね。
でも、この本は帯にあるとおりハンズオンで学べるので、コマンド操作からコンテナの作成、コンテナ間通信とかひと通りのことは理解できました。
開発環境の構築、破壊が簡単で安心して行えるDockerは今後の主流になるかもしれませんね。
コメント