0

Jsoup を使用すると、特定のタグがテキスト内に存在する回数を簡単にカウントできます。たとえば、指定されたテキストにアンカータグが何回存在するかを確認しようとしています。

    String content = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>. <p>An <a href='http://example.com/'><b>example</b></a> link.</p>. <p>An <a href='http://example.com/'><b>example</b></a> link.</p>. <p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
    Document doc = Jsoup.parse(content);
    Elements links = doc.select("a[href]"); // a with href
    System.out.println(links.size());

これにより、カウントは 4 になります。文があり、その文に html タグが含まれているかどうかを知りたい場合、Jsoup で可能ですか? ありがとうございました。

4

1 に答える 1

1

正規表現を使用したほうがよいかもしれませんが、本当に JSoup を使用したい場合は、すべての要素を照合してから 4 を引くことができます。これは、JSoup が自動的に 4 つの要素、つまり最初にルート要素を追加し、次に<html><head>および<body>要素。

これは大まかに次のようになります。

// attempt to count html elements in string - incorrect code, see below 
public static int countHtmlElements(String content) {
    Document doc = Jsoup.parse(content);
    Elements elements = doc.select("*");
    return elements.size()-4;
}

ただし、テキストに、または;が含まれている場合、これは間違った結果になります。次の結果を比較します。<html><head><body>

// gives a correct count of 2 html elements
System.out.println(countHtmlElements("some <b>text</b> with <i>markup</i>"));
// incorrectly counts 0 elements, as the body is subtracted 
System.out.println(countHtmlElements("<body>this gives a wrong result</body>"));

したがって、これを機能させるには、「magic」タグを個別に確認する必要があります。そのため、正規表現の方が簡単かもしれません。

これを機能させる試みがさらに失敗しました:parseBodyFragment代わりに使用parseしても役に立ちません。これは、JSoup によって同じ方法でサニタイズされるためです。同じように、as を数えるdoc.select("body *");ことで 4 を引く手間が省けますが、a<body>が関係している場合は間違った数になります。<html>チェックする文字列に,<head>または<body>要素が存在しないことが確実なアプリケーションがある場合にのみ、その制限の下で動作する可能性があります。

于 2013-02-15T22:30:53.473 に答える