/var/log/seiji

25 Jun 2008

BeautifulSoupで厳密なHTMLParse

Pythonで有名なHTMLParseModuleとしてBeautifulSoupがあります。 HTMLをParseしてByteSizeを徐々に増やそうとした場合、BeautifulSoupでParseしても変更しない箇所については以前のままで保持する必要があります。が、BeautifulSoupは厳密にParseしています。
Beautiful Soup_ We called him Tortoise because he taught us.-1.jpg
Beautiful Soup: We called him Tortoise because he taught us.

target HTML Sample

下のようなHTMLをtargetとします。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf_8" />
<title>BeautifulSoup Test</title>
</head>
<body>

<h1>BeautifulSoup Test</h1>
<h2>Image</h2>

<img src="img/test.gif" title="testimage"  alt="testimage" />

</body>
</html>

BeautifulSoupによるParse

BeautifulSoupでParseするコードが以下です。


# -*- coding: utf-8 -*-
from BeautifulSoup import BeautifulSoup

TARGET_FILE='test.html'

if __name__ == '__main__':
    f=open(TARGET_FILE,'r')
    s = f.read()
    soup = BeautifulSoup(s)

    # Before Parse
    print "Before Length (%d)" % len(s)
    # After Prase
    print "After Length (%d)" % len(soup.renderContents())

実行結果

では実際に実行してみます。


$ python test.py
Before Length (431)
After Length (412)

19バイトも差がでます。どう変更されているのでしょうか?

解析

Parseの前後では中身を比較すると色々変更されていることがわかります。実査に変更された箇所は以下でした。

  • 改行コードがCRLF→LFに
  • metaタグのcharsetの表記を訂正されutf_8→utf-8に
  • 不要な行が削除
  • 要素の属性と属性の間を半角スペース1文字へ

以上の点が変更された為、ファイルサイズが少なくなっていました。ほんどのCaseでHTMLParseする際はファイルサイズはあまり気にしないとは思いますが、Parseする為に厳密にしているわけですね。

Comments

comments powered by Disqus