Javaを使用してHTMLドキュメントをDOMツリーに読み込むことができるパーサー/ライブラリはありますか? Javaが提供する標準のDOM/Xpath
APIを使用したいと思います。
ほとんどのライブラリには、このタスクを解決するためのカスタムAPIがあるようです。さらに、HTMLからXML-DOMへの変換は、利用可能なパーサーのほとんどでサポートされていないようです。
優れたHTMLDOMパーサーに関するアイデアや経験はありますか?
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はやや面倒な場合がありますが、長年使用した後は、もう気になりません。
これが役に立つかもしれないリンクです。これは、Java JavaのオープンソースHTMLパーサー のオープンソースHTMLパーサーのリストです。
TagSoup あなたがやりたいことをすることができます。
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