有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么Jericho解析器不能解析这个HTML代码?

我在应用程序中使用jericho解析器来获得一个更轻版本的网页,从中提取一些部分。例如,当我得到这个代码时:

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

应用程序崩溃了。。。那么,打火机页面有什么问题


共 (1) 个答案

  1. # 1 楼答案

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

    我承认我只能找到这个方法的zero-argument overload的Javadoc,而不是您正在使用的一个参数重载,因此我必须假设两个方法返回相同的类型,List<Element>。在您的示例中,HTML中没有center元素,因此getAllElements()方法应该返回空的List<Element>。它不必在这里返回ArrayList<Element>;任何List<Element>的实现都可以。在本例中,它选择返回一个^{}。这不是一个ArrayList<Element>,你会得到一个ClassCastException,因为你不能把它转换成一个ArrayList<Element>

    据我所知,你有两个选择:

    • 首先,您可能不需要返回的列表是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));