2011-09-03 5 views
10

HTML文書をXMLとして(たとえばXPathを使用して)照会したいので、HTMLクリーナーの何らかの形式でHTMLを渡す必要があります。生成されたノードが元のテキストのインデックスを保持するJava HTMLパーサーはありますか?

しかし、オリジナルのソース文字列には、クエリの結果に基づいて変更を加えたいと思います。

元のソース文字列のインデックスを保持するJava HTMLパーサがあるので、ノードを見つけて元の文字列の正しい部分を変更できますか?

乾杯。

+2

DOMを操作して文字列表現に変換する方が良いのではないでしょうか?あなたは、あなたの変更と一緒にHTMLのよりクリーンなバージョンを持っています。元のソース文字列を変更する必要がある特定の理由はありますか? –

+0

私は1つ考えることができます。それは、XMLを少し違った形でレンダリングするアンパイーザの結果であるテキストの変更の束をぬぐう必要がない場合に、何が実質的に修正されたかを容易に把握することができます。 –

+0

Vivin - 私は元のHTML(999やxxxなどで上書きされた機密データを持つ)に対して他の解析テストを実行できるように、HTMLページから特定の機密項目を 'きれいにする'ことを試みています。 また、JavaとJavascriptの両方で異なるテストを実行したいので、JavaのHTMLパーサと各ブラウザのHTMLパーサーが異なるDOMを生成する可能性があるため、元のソースが私の最善の出発点ですすべきではない)。 –

答えて

0

「元のテキストのインデックスを保持する」部分についてはわかりませんが、Jerichoは非常に優れたHTMLパーサライブラリです。ここで

は、HTMLからすべてのスパンを削除する方法の例です:

public static String removeSpans(String html) { 
    Source source = new Source(html); 
    source.fullSequentialParse(); 
    OutputDocument outputDocument = new OutputDocument(source); 
    List<Tag> tags = source.getAllTags(); 
    for (Tag tag : tags) { 
     String tagname = tag.getName().toLowerCase(); 
     if (tagname.equals("span")) { 
      //remove the <span> 
      outputDocument.remove(tag); 
     } 
    } 
    return outputDocument.toString(); 
} 
+0

申し訳ありませんがdownvote、しかし、この答えは私の質問には関係ありません。 –

0

他の人も示唆しているように、おそらくDOMをレンダリングする必要があります。これは、基本的にノードツリーを構築することを意味し、jTidyのようなHTMLクリーナーを使用しない限り、文書ソースを変更することはありません。次に、文書に簡単にアクセスでき、必要に応じて文書を変更することができます。私はDOM4Jを提案する、それは良いapiとxpathサポートも持っている。

ドキュメントのトラバーサル/クエリ中に、リストにキャッシュしたり、後でテキストを変更したい要素やノードをマップしたりする際に、「インデックス作成」要件を再適用します。

2

ジェリコはあなたの望むものとほとんど同じですね。これは、元の文書に邪魔にならないように特別に設計された堅牢なHTMLパーサーです。

DOM、SAX、StAXのいずれのインターフェイスも付属していませんが、あなたのアプローチをかなり容易に適合させることができるような標準に似たカスタムAPIを備えています。あなたとジェリーコを使用しています。たとえば、JerichoドキュメントでXPathクエリを実行するには、Jaxenを使用します(例はthis blog entryを参照)。

Jerichoはすべての要素、タグ名や属性名などの要素の属性も含めてbeginと終了属性を持っているため、その情報でドキュメントを編集できますが、Jerichoが実際に輝く場所はOutputDocument getBegin()とgetEnd()を明示的に呼び出して代わりのメソッドに渡す代わりに、クエリに一致するJericho要素を持つ適切なメソッドを呼び出すことで、置換を直接指定することができます。

+0

これもチェックします。ありがとう。私はそれらを試してみたときに戻ってきてそれぞれに答えます。 –

0

これはDOMをクロールするための素晴らしい

http://jtidy.sourceforge.net/

Tidy tidy = new Tidy(); // obtain a new Tidy instance 
tidy.setXHTML(boolean xhtml); // set desired config options using tidy setters 
...       // (equivalent to command line options) 

tidy.parse(inputStream, System.out); 

に動作します、私はJDOM、より速く、簡単なXMLその後、その方法を使用することをお勧めします。

DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.newDocument(); 
Element root = doc.createElement("root"); 
Text text = doc.createText("This is the root"); 
root.appendChild(text); 
doc.appendChild(root); 

http://www.jdom.org/

は限り実装が懸念しているように私は新しい文書を作成し、ソースからそれにノードを追加します。

1

私たちはjericho html parserを解析に使用し、htmlcleanerを使用して実際のクリーンアップを行います。

修正したサーバーアプリケーション(メモリ管理、ログ)内でのジェリコの動作に問題がありました。 (元の開発者は、私たちの問題がメインコードブランチに入れるのに十分重要だとは思わなかった)。 Our fork is on github. fixes to htmlcleanerも製作しました。

0

ANTLRHTML grammarと入力してみてください。それはまた、内蔵あり、試してみて、実際のHTMLパーサとしてそれを使用して、興味のある元の文字列にインデックスを取得

をか -

あなたは(少なくとも)2つのアプローチを取ることができます。ソーステキストのインプレース変換をサポートしています。ここでは、文章の一部としてテキストに対して実行する変換を定義します。