parser = new Parser(con); Parser.getConnectionManager ().setRedirectionProcessingEnabled (true); NodeFilter filter = new AndFilter(new TagNameFilter("a"), new HasAttributeFilter("href")); NodeList nodeList = parser.parse(filter); for (Node node: nodeList.toNodeArray()) { TagNode tagNode = (TagNode)node; writer.println(tagNode.getAttribute("href")); writer.println(getText(tagNode)); }いわゆるDomとは仕様が違うのが気になるけど,とりあえずこまらないかな.
2009年12月12日土曜日
html parser for GAE
JavaにはHTML parser はやまほどある.一番簡単なのは,Swing に標準で含まれている javax.swing.text.html.parser.* を使う方法.だが,しかしこのパーザは,GAEでは使えない.swingが丸ごとblack listに入っているせい.実際にはグラフィックを使う部分ではないから
この部分には害はないはずなのだけど.
他にもパーザはやまほどある.
htmlcleanerと言うものを使ってみたが,いまいちうまくいかない.
原因は,文書内のMETAタグの中のcharsetをちゃんと読んでくれないせい.
本来,HTTPのヘッダに含まれるContent-typeに含まれているべき情報なのだけど,
HTTPサーバだって各文書の文字コードのことまでは知らないので,ちゃんと設定するのはむずかしい.なので,METAタグでhttp-equivで書くのが普通.
htmlcleanerに渡すReaderを適当な文字コードで作ってやれば読めるのだけど,それには,先に一度文書の中を読んで,METAタグを調べてから,htmlcleanerに食わせてやらなければならない.
面倒だ.
HTML Parser(どうでもいいが,もうすこし個体を識別できる名前をつけてほしい)は,まずは適当な仮定を持ってストリームを読み,meta tagを読み込んだ時点で,仮定と異なる文字コードだった場合には,頭からパーズし直してくれるらしい.
使ってみると確かにちゃんと読めているようだ.
EUCのasahi.comもutf-8のwikipedia.jpも何も気にしないで読める.
こりゃ便利.ツリーの中のノードに対して適当な条件をつけて,合致するノードだけ返す,なんてこともできる.a タグ で href があるものだけ,という条件で読んでみるとこんな感じ.
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿