2024年3月
        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    
無料ブログはココログ

 

« 株:現物売り約定(新日本理化株式会社) | トップページ | ギザ十ゲットだぜ!134枚目 »

2011年5月21日 (土)

HTMLの解析は、どないすればいいねん

C#でHTMLを解析してXMLオブジェクトとして扱うには無理があることに気付いた。

HTMLはXMLのようにValid文書である保証がない。”汚い”書き方をしてもWebブラウザが良いように解析してしまい、何とかなってしまう。あと、HTMLだと要素名に使える文字をXMLElementの要素名に設定できない。
HTML文書の内容は、保証されていないことから正規表現を使うのも微妙。

<html>
<head>
</head>
<body>
<testい!"#$%&'()=^~\|[{]}:*;+\_/?.,<tesあ>
<testろ!"#$%&'()=^~\|[{]}:*;+\_/?.,</tesあ>
<testは!"#$%&' ()=^~\|[{]}:*;+\_/?.,<tesあ>
<testに!"#$%&'()=^~\|[{]}:*;+\_?.,<tesあ>
<testほ!"#$%&'()=^~\|[{]}:*;+\_?.,</tesあ>
<c testへ!"#$%&'()=^~\|[{]}:*;+\_?.,</tesあ>
<c testと!"#$%&'()^~\|[{]}:*;+\_?.,</tesあ>
<c testち!"#$%&'()^~\|[{]}:*;+\_?.,<tesあ>
</body>
</html>

これをfirefoxで読み込んでfirebugで見てみると、タグの要素名は以下のようになる。

  1. testい!"#$%&'()=^~\|[{]}:*;+\_
  2. testろ!"#$%&'()=^~\|[{]}:*;+\_
  3. testは!"#$%&'
  4. testに!"#$%&'()=^~\|[{]}:*;+\_?.,<tesあ
  5. testほ!"#$%&'()=^~\|[{]}:*;+\_?.,<

ということは、要素名は空白類文字(スペース、タブ[\t]、改行[\n]、垂直タブ[\v]、書式送り[\f]、復帰[\r])、">"、"/"で区切られるということの模様。
要素名の後ろに文字列がある場合は、属性名として扱われる。要素名の区切りは"="、">"、空白文字列類、"/"。
属性名の後ろに"="がある場合は、その後ろの文字列を属性値として扱われる。属性値の区切りは、ダブルクォーテーションまたはシングルクォーテーションでくくってあるか、空白文字列類、"/"、">"。
というのが試してみた結果。
開始要素タグと終了要素タグの組が一致していないときとか、入れ子状態になっているときとか、めんどくさい・・・。

んで、すでに発表されているHTML DOM やParserを使いたいと思っているのだが、適当なのが見当たらん。

SGMLReader は、XMLオブジェクトにするのであかんね。HTMLで使えない文字が出てくると、要素の値として扱われる見たい。
Majestic-12のC# HTML parserは、日本語ダメみたいですね。漢字以前が無かったこととになるみたい。
WebBrowserオブジェクトを使うのはマジ勘弁。

« 株:現物売り約定(新日本理化株式会社) | トップページ | ギザ十ゲットだぜ!134枚目 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: HTMLの解析は、どないすればいいねん:

« 株:現物売り約定(新日本理化株式会社) | トップページ | ギザ十ゲットだぜ!134枚目 »