【问题标题】:Why can't Jericho parser parse this HTML code?为什么 Jericho 解析器不能解析这段 HTML 代码?
【发布时间】:2012-01-31 08:31:53
【问题描述】:

我在我的应用程序中使用 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

应用程序崩溃了……那么,较轻的页面有什么问题?

【问题讨论】:

  • 你应该发布异常,否则很难弄清楚......
  • 更新了从 logCat 获取的错误信息
  • 您没有得到任何类型的堆栈跟踪,还是只得到您粘贴的内容?

标签: java html-parsing jericho-html-parser


【解决方案1】:

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

我承认我只能找到此方法的 zero-argument overload 的 Javadoc,而不是您正在使用的单参数重载,因此我必须假设两种方法返回相同的类型,@ 987654324@。在您的示例中,HTML 中没有 center 元素,因此 getAllElements() 方法应该返回一个空的 List&lt;Element&gt;。它不必在这里返回ArrayList&lt;Element&gt;; List&lt;Element&gt; 的任何实现都可以。在这种情况下,它选择返回Collections.emptyList()。这不是ArrayList&lt;Element&gt;,您会得到ClassCastException,因为您不能将其转换为ArrayList&lt;Element&gt;。

据我所知,您有两种选择:

  • 首先,您可能不需要返回的列表是ArrayList&lt;Element&gt;。改用List&lt;Element&gt; 可能就足够了。在这种情况下,您应该替换该行

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

    与

    List<Element> centerElems = pageSource.getAllElements(HTMLElementName.CENTER);
    
  • 其次,如果您确实需要列表为ArrayList&lt;Element&gt;,那么您可以根据结果创建ArrayList&lt;Element&gt;:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2010-09-19
    • 2021-02-15
    相关资源
    最近更新 更多