1

アプリケーションで jericho パーサーを使用して、軽量バージョンの Web ページを取得し、そこからいくつかの部分を抽出します。たとえば、次のコードを取得すると、次のようになります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN/" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> </head> <body> <b> <span class="articletitletext">Happy New Year!</span></b> <br> <span class="postedstamp">Posted By <script language="JavaScript" type="text/javascript"> <!-- document.write('<a href="&#32;&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#104;&#114;&#105;&#115;&#46;&#119;&#121;&#109;&#97;&#110;&#64;&#118;&#101;&#114;&#105;&#122;&#111;&#110;&#46;&#110;&#101;&#116;">'); // --> </script>Chris</a> on January 1, 2012</span><br> <br> <span id="intelliTXT">

From all of us here at TheForce.net, we wish you and your family a safe and Happy New Year. May the Force be with you in 2012!

</span></body> </html>

jericho パーサーを使用してもう一度解析したいのですが、実行すると

ArrayList<Element> centerElems=(ArrayList<Element>) pageSource.getAllElements(HTMLElementName.CENTER);

私はこの例外を得ました

01-01 10:46:37.518: ERROR/AndroidRuntime(648): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.test.theforce/net.test.theforce.NewsListActivity}: java.lang.RuntimeException: java.lang.ClassCastException: java.util.Collections$EmptyList

そして、アプリケーションがクラッシュします...では、軽量化されたページの何が問題になっているのでしょうか?

4

1 に答える 1

2

Jericho パーサーは、指定された HTML を解析できるように見えます。getAllElements()メソッドが返すものについて誤った仮定をしたため、発生しているエラーが発生します。

使用している引数が 1 つのオーバーロードではなく、このメソッドの引数がゼロのオーバーロードの Javadoc しか見つからなかったことを認めます。そのため、両方のメソッドが同じ型を返すと仮定する必要がありますList<Element>。あなたの例ではcenter、HTML に要素がないため、getAllElements()メソッドは空の を返す必要がありますList<Element>ArrayList<Element>hereを返す必要はありません。の任意の実装List<Element>が行います。この場合、 を返すことを選択しCollections.emptyList()ます。これは ではありません。これを にキャストできないためArrayList<Element>、 が得られます。ClassCastExceptionArrayList<Element>

私が見る限り、2 つのオプションがあります。

  • まず、返されるリストをArrayList<Element>. 代わりに使用するのに十分かもしれませんList<Element>。この場合、行を置き換える必要があります

    ArrayList<Element> centerElems=(ArrayList<Element>) pageSource.getAllElements(HTMLElementName.CENTER);
    

    List<Element> centerElems = pageSource.getAllElements(HTMLElementName.CENTER);
    
  • 次に、本当にリストを にする必要がある場合は、結果からArrayList<Element>を作成できます。ArrayList<Element>

    ArrayList<Element> centerElems = new ArrayList<Element>(pageSource.getAllElements(HTMLElementName.CENTER));
    
于 2012-01-01T14:56:03.077 に答える