Tue, September 22, 2009
URLからページタイトルを取得する方法(Jython)
Jythonを使って、 指定されたURLからページタイトルを抽出する方法。
実装の基本方針
- URLからHTMLを取り出す
- HTMLデータの文字エンコーディングを取得(※)
- HTML中の < title > を探して、ページタイトルを取得する
※)文字エンコーディング取得
HTMLのヘッダ要素内の meta 要素で、charset が指定されている記述から取得します。
例)
<meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS" />この場合は、Shift_JIS。
コード get-title.py
import sys
import java
import java.io as io
import java.util.regex as re
PAT_ENCODE=re.Pattern.compile('<meta\\s*http-equiv.*charset=([0-9a-zA-Z_]*)"',re.Pattern.CASE_INSENSITIVE)
def getEncoding(url):
enc='UTF-8'
br=io.BufferedReader(io.InputStreamReader(url.openStream()))
while(True):
line=br.readLine()
if line==None:
break
m=PAT_ENCODE.matcher(line)
if m.find():
enc = m.group(1)
break
br.close()
return enc
PAT_TITLE=re.Pattern.compile('<title>(.*)</title>',re.Pattern.CASE_INSENSITIVE)
def getTitle(url):
title='Title not found'
enc=getEncoding(url)
br=io.BufferedReader(io.InputStreamReader(url.openStream(),enc))
while(True):
line=br.readLine()
if line==None:
break
m=PAT_TITLE.matcher(line)
if m.find():
title = m.group(1)
break
return title
urlstr=sys.argv[1]
print getTitle( java.net.URL(urlstr) )
- getEncoding(url) 関数で文字エンコーディングを取得(不明な場合はUTF-8と見なす)
- getTitle(url) 関数でタイトルを取得
タイトルを取得するためだけに 文字エンコーディングの取得とタイトルの取得で二度もHTMLをネットワークから取り出すのは どうかとも思いましたが、とりあえず目的は達成できたので、よしとする。
作動テスト
試しに首相官邸ホームページのタイトルを取得してみます。
$ jython get-title.py http://www.kantei.go.jp/
首相官邸ホームページ
注意点
- HTMLに記述されたcharsetの値をそのまま使って java.io.InputStreamReader を生成しているため、Javaでサポートされていない文字エンコーディング名を使ってしまう可能性がある。
- charset の記述がない場合は、うまく処理できない(偶然UTF-8でHTMLが記述されていない限りは)