主要な Java HTML パーサーの長所と短所は何ですか? [closed] 質問する

主要な Java HTML パーサーの長所と短所は何ですか? [closed] 質問する

SO と Google で検索すると、さまざまな団体から一貫して推奨されている Java HTML パーサーがいくつかあることがわかりました。残念ながら、さまざまなライブラリの長所と短所に関する情報を見つけるのは困難です。これらのライブラリを比較して、学んだことを共有してくれる人がいればと思います。

私が見たものは次のとおりです:

また、私が見逃した主要なパーサーがあれば、その長所と短所についてもぜひお聞きしたいです。

ありがとう!

ベストアンサー1

一般的な

ほとんどすべての既知のHTMLパーサーは、W3C DOM API(JAXP API、XML処理のためのJava APIの一部)であり、org.w3c.dom.DocumentJAXP API で直接使用できる状態に戻します。主な違いは通常、問題のパーサーの機能にあります。ほとんどのパーサーは、非整形式の HTML ("tagsoup") に対してある程度寛容で寛大です。たとえば、JTidyネコHTMLタグスープそしてHTMLクリーナー通常、この種の HTML パーサーは HTML ソースを「整理」するために使用します (たとえば、HTML 有効なものを<br>XML 有効なものに置き換えます<br />)。これにより、W3C DOM および JAXP API を使用して「通常の方法」でトラバースできるようになります。

目立つのはHTMLユニットそしてジェイスープ

HTMLユニット

HTMLユニット完全に独自の API を提供し、プログラム的に Web ブラウザのように動作することができます。つまり、フォームの値を入力したり、要素をクリックしたり、JavaScript を起動したりすることができます。これは単なる HTML パーサーではありません。これは、真の「GUI のない Web ブラウザ」であり、HTML ユニット テスト ツールです。

ジェイスープ

ジェイスープ完全に独自のAPIも提供しています。これにより、要素を選択することができます。jQuery-のようにCSSセレクターまた、HTML DOM ツリーをトラバースして目的の要素を取得するための洗練された API も提供します。

特にHTML DOMツリーのトラバースはJsoupの大きな強みです。Jsoupを使ったことがある人なら、org.w3c.dom.Document冗長な構文を使ってDOMをトラバースするのがいかに大変か知っているでしょう。NodeListそしてNodeAPI。確かに、XPath生活は楽になりますが、それでも、学習曲線が変わり、冗長になってしまう可能性があります。

これは、JTidy のような「プレーン」な W3C DOM パーサーを XPath と組み合わせて使用​​し、質問の最初の段落とすべての回答者の名前を抽出する例です (XPath を使用しないと、ユーティリティ/ヘルパー メソッドを記述せずに、関心のある情報を収集するために必要なコードが 10 倍も大きくなるため、XPath を使用しています)。

String url = "http://stackoverflow.com/questions/3152138";
Document document = new Tidy().parseDOM(new URL(url).openStream(), null);
XPath xpath = XPathFactory.newInstance().newXPath();
  
Node question = (Node) xpath.compile("//*[@id='question']//*[contains(@class,'post-text')]//p[1]").evaluate(document, XPathConstants.NODE);
System.out.println("Question: " + question.getFirstChild().getNodeValue());

NodeList answerers = (NodeList) xpath.compile("//*[@id='answers']//*[contains(@class,'user-details')]//a[1]").evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < answerers.getLength(); i++) {
    System.out.println("Answerer: " + answerers.item(i).getFirstChild().getNodeValue());
}

Jsoup でまったく同じことを実行する例を次に示します。

String url = "http://stackoverflow.com/questions/3152138";
Document document = Jsoup.connect(url).get();

Element question = document.select("#question .post-text p").first();
System.out.println("Question: " + question.text());

Elements answerers = document.select("#answers .user-details a");
for (Element answerer : answerers) {
    System.out.println("Answerer: " + answerer.text());
}

違いがわかりますか? コードが少ないだけでなく、CSS セレクターに関する中程度の経験 (Web サイトの開発や jQuery の使用など) がある場合、Jsoup は比較的簡単に理解できます。

まとめ

それぞれの長所と短所はもう十分明らかでしょう。標準のJAXP APIを使用してトラバースしたいだけなら、最初に挙げたパーサーのグループを選んでください。たくさんどれを選ぶかは、そのライブラリが提供する機能 (HTML のクリーニングが簡単になる方法、リスナー/インターセプターやタグ固有のクリーナーがあるか) とライブラリの堅牢性 (どのくらいの頻度で更新/保守/修正されるか) によって異なります。HTML の単体テストを行う場合は、HtmlUnit が最適です。HTML から特定のデータを抽出したい場合 (実際の要件としてよくある) は、Jsoup が最適です。

おすすめ記事