Search on the blog

2010年10月16日土曜日

PythonでHTML解析

最近、pagerankに関する論文を読んで、ネットワーク関係のプログラミングをしたくなってきました。今日はpythonを使った簡単なhtml分析を紹介します。(本当に簡単ですいません。。)

pagerankは言わずと知れたgoogleで使われているwebページの重要度を割りあてるための手法。
論文を読むまでは、ページに重み付けて、入力リンクの重み付け和を計算してるだけだろうと、ナメてました。忘れてました。彼らはStanfordの学生だったのです。
上の計算を大規模なネットワークに適用するために、グラフ理論と行列・固有値を駆使して高速に解くという学術的なことをちゃんとやってました。。

簡易版のpagerankなら簡単に実装できそうな気がしたので(気がしただけ)、pythonを使って勉強を始めようかと思います。

とりあえず、今日やったのは、
  1. yahooのhtml ソースを取得する
  2. 自分のbloggerのページから張っているリンク先のページを列挙する
です。
以下ソース。
まず一つ目。
'''
sample 1
Get html contents and automatically decode its strings
'''
import urllib2

res = urllib2.urlopen("http://yahoo.co.jp")
charset = res.headers.getparam('charset')
html = res.read().decode(charset)
print html
urllib2というモジュールを使うと簡単にhtmlコンテンツを取得できます。あとは、文字コードを取得してそれをデコードすればOK。

次に二つ目。
'''
sample 2
Get html contents and get the link from the page
'''
import urllib2
import re

def getHrefAddress(x):
x = re.sub(r'^href="|^href=\'', '', x)
x = re.sub(r'"$|\'$', '', x)
if re.match(r'http://', x) == None or re.match(url, x):
x = None
return x

url = "http://techtipshoge.blogspot.com/"
res = urllib2.urlopen(url)
html = res.read()
links = re.findall(r'href=".+?"|href=\'.+?\'', html)
links = map(getHrefAddress, links)
links = filter(None, links)
for link in links:
print link
これは、ちょっと汚いです。BeautifulSoupというHTMLパーサライブラリがあるのでそれを使うともっとスマートに書けそうです。
上のソースでは、正規表現でリンクを取得し、自ページ(サブページ含む)へのリンクやjavascriptへのリンクは無視しています。それらしい情報を取り出すことができました。
次は、取得したリンクから再帰的にページを辿っていくようなものを作ってみたいと思います。

0 件のコメント:

コメントを投稿