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で見てみると、タグの要素名は以下のようになる。
- testい!"#$%&'()=^~\|[{]}:*;+\_
- testろ!"#$%&'()=^~\|[{]}:*;+\_
- testは!"#$%&'
- testに!"#$%&'()=^~\|[{]}:*;+\_?.,<tesあ
- testほ!"#$%&'()=^~\|[{]}:*;+\_?.,<
ということは、要素名は空白類文字(スペース、タブ[\t]、改行[\n]、垂直タブ[\v]、書式送り[\f]、復帰[\r])、">"、"/"で区切られるということの模様。
要素名の後ろに文字列がある場合は、属性名として扱われる。要素名の区切りは"="、">"、空白文字列類、"/"。
属性名の後ろに"="がある場合は、その後ろの文字列を属性値として扱われる。属性値の区切りは、ダブルクォーテーションまたはシングルクォーテーションでくくってあるか、空白文字列類、"/"、">"。
というのが試してみた結果。
開始要素タグと終了要素タグの組が一致していないときとか、入れ子状態になっているときとか、めんどくさい・・・。
んで、すでに発表されているHTML DOM やParserを使いたいと思っているのだが、適当なのが見当たらん。
SGMLReader は、XMLオブジェクトにするのであかんね。HTMLで使えない文字が出てくると、要素の値として扱われる見たい。
Majestic-12のC# HTML parserは、日本語ダメみたいですね。漢字以前が無かったこととになるみたい。
WebBrowserオブジェクトを使うのはマジ勘弁。
« 株:現物売り約定(新日本理化株式会社) | トップページ | ギザ十ゲットだぜ!134枚目 »
コメント