2012-01-01 240 views
1

我在我的应用程序中使用jericho解析器来获取较轻的版本的网页,从中提取一些部分。所以,举例来说,当我得到这个代码:为什么Jericho解析器不能解析这个HTML代码?

<!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> 

我想用杰里科解析器再次解析它,但是当我运行

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 

和应用程序崩溃...所以,打火机页面有什么问题?

+0

你应该发布异常,否则它是一个很大的差异很难找出... – AHungerArtist 2012-01-01 12:09:25

+0

更新错误信息取自logCat – user1012480 2012-01-01 12:11:48

+0

你没有得到任何类型的堆栈跟踪,或者你刚刚得到你粘贴的东西吗? – AHungerArtist 2012-01-01 12:17:23

回答

2

它在我看来像Jericho解析器可以解析你给它的HTML。出现错误的原因是您对getAllElements()方法返回的内容做出了错误的假设。

我承认我只能找到此方法的zero-argument overload的Javadoc,与您使用的单参数重载相反,所以我将不得不假设这两种方法返回相同类型,即List<Element>。在你的例子中,HTML中没有center元素,所以getAllElements()方法应该返回一个空的List<Element>。它不必在这里返回ArrayList<Element>;任何List<Element>的执行都会执行。在这种情况下,它选择返回Collections.emptyList()。这不是ArrayList<Element>,并且您得到ClassCastException,因为您不能将其转换为ArrayList<Element>

据我所看到的,你有两个选择:

  • 首先,你可能不需要在返回的列表是一个ArrayList<Element>。代替使用List<Element>可能就足够了。在这种情况下,你应该

    List<Element> centerElems = pageSource.getAllElements(HTMLElementName.CENTER); 
    
  • 其次更换线

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

    ,如果你真的需要列表是一个ArrayList<Element>,那么你就可以创建结果的ArrayList<Element>

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