web-dev-qa-db-ja.com

Java)を使用してHTMLファイルをDOMツリーに読み取る

Javaを使用してHTMLドキュメントをDOMツリーに読み込むことができるパーサー/ライブラリはありますか? Javaが提供する標準のDOM/XpathAPIを使用したいと思います。

ほとんどのライブラリには、このタスクを解決するためのカスタムAPIがあるようです。さらに、HTMLからXML-DOMへの変換は、利用可能なパーサーのほとんどでサポートされていないようです。

優れたHTMLDOMパーサーに関するアイデアや経験はありますか?

12
Stefan Teitge

JTidy 、ストリームをXHTMLに処理してから、お気に入りのDOM実装を使用して再解析するか、制限されたDOMインプで十分な場合はparseDOMを使用します。

または Neko

6
bobince

HTMLファイルは一般的に問題があるため、最初にパーサー/スキャナーを使用してクリーンアップする必要があります。私はJTidyを使用したことがありますが、決して幸せではありません。 NekoHTMLは問題なく動作しますが、これらのツールは常に、意図されているものを最もよく推測しているだけです。スキーマに準拠するまで、プログラムにドキュメントのマークアップを変更させることを効果的に求めています。これにより、構造(マークアップ)、スタイル、またはコンテンツが失われる可能性があります。それは避けられないことであり、ブラウザを介して手動でスキャンしない限り、何が欠けているのかを実際に知ることはできません(そして、ブラウザも信頼する必要があります)。

それは本当にあなたの目的に依存します—大量の無関係な(非HTML)マークアップを含む何千もの醜いドキュメントがある場合、手動プロセスはおそらく不合理です。いくつかの重要なドキュメントの正確性を目標としている場合は、それらを手動で修正するのが妥当な提案です。

1つのアプローチは、エラーメッセージを使用して最終的に壊れたマークアップを修正する編集サイクルで、整形式および/または検証パーサーを介してソースを繰り返し渡す手動プロセスです。これにはXMLのある程度の理解が必要ですが、それは着手するのに悪い教育ではありません。

Java 5)を使用すると、必要なXML機能(JAXP APIと呼ばれる)がJava自体に組み込まれます。外部ライブラリは必要ありません。

最初にDocumentBuilderFactoryのインスタンスを取得し、その機能を設定し、DocumentBuilder(パーサー)を作成してから、InputSourceを使用してそのparse()メソッドを呼び出します。 InputSourceにはいくつかの可能なコンストラクターがあり、次の例ではStringReaderを使用しています。

import javax.xml.parsers.*;
// ...

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
dbf.setNamespaceAware(true);
dbf.setIgnoringComments(false);
dbf.setIgnoringElementContentWhitespace(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
return db.parse(new InputSource(new StringReader(source)));

これにより、DOMドキュメントが返されます。外部ライブラリを使用してもかまわない場合は、JDOMおよびXOM APIもあります。これらには、JAXPのSAXおよびDOM APIに比べていくつかの利点がありますが、Java以外のライブラリを追加する必要があります。 DOMはやや面倒な場合がありますが、長年使用した後は、もう気になりません。

3
Ichiro Furusato

これが役に立つかもしれないリンクです。これは、Java JavaのオープンソースHTMLパーサー のオープンソースHTMLパーサーのリストです。

2
Dewsworld

TagSoup あなたがやりたいことをすることができます。

0

https://jsoup.org を使用します。これは非常に単純で、power.canはhtmlを読み取って変更できます。

サンプル:

Document doc = Jsoup.parse(page);  //page can be a file or string.
Element main = doc.getElementById("MainView");
Elements links = doc.select(".link");

要素を作成するには、j2htmlを使用できます https://j2html.com

0
Ali Bagheri