忍者ブログ
     2008年11月14日 開始
[24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

BeautifulSoupでHTML解析

| | コメント(0) | トラックバック(0)

BeautifulSoupが素晴らしいので
他にあまり解説サイトもないし、
簡単に使えそうなものを羅列してみた。

ただしデフォルトエンコーディングを設定している事が前提。

BeautifulSoupに渡されたHTMLは、
utf-8に文字コードを変換され自動で綺麗に生成しなおされる。
prettify()を使用すると、綺麗なソースに生成しなおされる。
※BeautifulSoup内で処理される場合は、このソースが元になる。

壊れたタグを修復という訳ではなさそうだが
改行やインデントを作り直してくれる。
Webアプリケーションとしても、かなり使えそう。

# -*- coding: utf-8 -*-

import string, re, urllib, urllib2
from BeautifulSoup import BeautifulSoup

url = 'http://www.google.co.jp/search?hl=ja&num=100&q='
# url = 'http://search.yahoo.co.jp/search?p=' # Yahooの場合

# クライアントを生成
opener = urllib2.build_opener()

# PythonのUAがGoogleに弾かれているようなので変更
opener.addheaders = [('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]

q = 'Perl使いのPythonちゃん' # 検索クエリ
q = urllib.quote(q) # クエリをURLエンコード

# Google検索結果を取得
print url+q
html = opener.open(url+q).read()

# HTMLソースをBeautifulSoupに渡す
soup = BeautifulSoup(html)

# エンコーディングを自動で取得
enc = soup.originalEncoding
print "Encoding : %s" % enc

# ソースを出力
# ※unicode(text, 'utf-8')はutf-8の文字をunicodeに変換
# print unicode(soup.prettify(), enc)

# ※UnicodeEncodeError: 'cp932' codec can't encode character...は、
# Windowsの拡張文字でエラーが起こっているのかも。
# その場合は'mbcs'というCodecを使う
#print unicode(soup.prettify(), enc).encode('mbcs')

### タグへのアクセス方法 - 1 (DOMもどきな扱い方)
print u'DOMもどきな扱い方'

# contents[0]で、その階層の1番上の要素にアクセス
# .name で、要素のタグ名を取得(小文字)
print soup.contents[0].name
# 結果はu'html'となる

# 更に子となる要素へアクセス(結果 : u'head')
print soup.contents[0].contents[0].name

# 要素を変数に格納
head = soup.contents[0].contents[0]

# 親要素にアクセス(結果 : u'html')
print head.parent.name

# 自分を含む、それ以下の階層の次の要素にアクセス(結果 : u'meta')
print head.next.name

# 同階層の次の要素にアクセス(結果 : u'body')
print head.nextSibling.name

# 複合(結果 : u'table')
print head.nextSibling.contents[0].name
# 複合(結果 : u'blockquote')
print head.nextSibling.contents[0].nextSibling.name

### タグへのアクセス方法 - 2 (よりDOMっぽい扱い方)

print u'DOMもどきな扱い方'

# タグ名でアクセス
titleTag = soup.html.head.title

# そのまま出力するとタグごと表示
print u"%s" % titleTag

# string でinnerText
print u"%s" % titleTag.string

# 要素数を取得
print len(soup('font'))

# 一致したタグの一番目を返す(属性で絞込みもできる)
soup.find('a')

# 一致したタグをリストにして返す(属性で絞込みもできる)
print soup.findAll('a', href="/")

# 正規表現さえ使える
print soup.find('a', href=re.compile('^/'))

# リストとしてアクセスも可能
print soup('a', href=re.compile('^/'))[1]

# 要素の値を返す
print soup('a', href=re.compile('^/'))[0]['href']

# 覚書 : xmlを解析する場合はBeautifulStoneSoup(xml)を使う?(未確認)

DOMのような感じで、置き換えたりタグを生成したりも
できるようだが、現状では必要ないのでまた今度。

ようし、飽きた!
これらを駆使してサンプルでも作ってみる。

トラックバック(0)

このブログ記事を参照しているブログ一覧: BeautifulSoupでHTML解析

このブログ記事に対するトラックバックURL: http://mt.blog-slime.com/mt-tb.cgi/8

コメントする

サインインしてください。 (匿名でコメントする)

このブログ記事について

このページは、adminが2007年7月27日 14:00に書いたブログ記事です。

ひとつ前のブログ記事は「PythonでHTML解析(HTMLParserより優れたパーサ)」です。

次のブログ記事は「Perlで言う、join関数が使い難い。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

PR


忍者ブログ [PR]
お天気情報
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
リンク
フリーエリア
最新CM
最新TB
プロフィール
HN:
No Name Ninja
性別:
非公開
バーコード
ブログ内検索
P R
カウンター
ブログの評価 ブログレーダー