2011年4月10日日曜日

解析木

ほとんどの場合、あなたは解析木ーBeautiful Soupがドキュメントを解析する際に構築するデータ構造ーに興味を持っているでしょうが、これまでは、ドキュメントの読み込みと書き出しに焦点を当ててきました。

( BeautifulSoup BeautifulStoneSoupの)パーサーオブジェクトは、 XML や HTMLドキュメントの構造に対応するよう、深くネストされ、適切に連結されたデータ構造です。
パーサーオブジェクトは2つの異なるオブジェクト型を持っています:
<TITLE> タグや、 <B>タグのようにタグに対応する タグオブジェクトと、"Page title" や "This is paragraph"のような文字に対応する、可航文字オブジェクトです。

また、特別なXML構造に対応する、 (CData、コメント、宣言、処理命令などの)可航文字のサブクラスもあります。
可航文字のサブクラスは、それらを出力する時に、付随する余分なデータを持つという点以外は、可航文字のように動作します。
ここに、コメントを含んだドキュメントがあります:
from BeautifulSoup import BeautifulSoup
import re
hello = "Hello! <!--I've got to be nice to get what I want.-->"
commentSoup = BeautifulSoup(hello)
comment = commentSoup.find(text=re.compile("nice"))

comment.__class__
# <class 'BeautifulSoup.Comment'>
comment
# u"I've got to be nice to get what I want."
comment.previousSibling
# u'Hello! '

str(comment)
# "<!--I've got to be nice to get what I want.-->"
print commentSoup
# Hello! <!--I've got to be nice to get what I want.-->

さて、本ドキュメントの冒頭で使われている文章をより詳しく見てみましょう。
from BeautifulSoup import BeautifulSoup 
doc = ['<html><head><title>Page title</title></head>',
       '<body><p id="firstpara" align="center">This is paragraph <b>one</b>.',
       '<p id="secondpara" align="blah">This is paragraph <b>two</b>.',
       '</html>']
soup = BeautifulSoup(''.join(doc))

print soup.prettify()
# <html>
#  <head>
#   <title>
#    Page title
#   </title>
#  </head>
#  <body>
#   <p id="firstpara" align="center">
#    This is paragraph
#    <b>
#     one
#    </b>
#    .
#   </p>
#   <p id="secondpara" align="blah">
#    This is paragraph
#    <b>
#     two
#    </b>
#    .
#   </p>
#  </body>
# </html>

タグの属性


タグオブジェクト可航文字オブジェクトは、多数の役立つメンバーを持っており、それらのほとんどについては、「解析木を航行する」と、「解析木を検索する」の章で取り上げています。

ですが、ここでは、タグオブジェクトの一面を取り上げます:それは属性です。

SGML タグは属性を持っています:. 例えば、先の例のHTML中のそれぞれの <P> タグは、"id"属性と、"align" 属性を持っています。
あなたは、タグオブジェクトをディクショナリのように扱うことで、タグ属性にアクセスできます:
firstPTag, secondPTag = soup.findAll('p')

firstPTag['id']
# u'firstPara'

secondPTag['id']
# u'secondPara'

可航文字オブジェクトには属性がありません; タグオブジェクトのみ、属性があります。

0 件のコメント:

コメントを投稿

【和訳】Django Rest Framework 目次

目次 【和訳】Django Rest Framework クイックスタート 【和訳】Django Rest Framework チュートリアル1:シリアル化 【和訳】Django Rest Framework チュートリアル2:リクエストとレスポンス 【和訳】Django Res...