使用JSoup解析HTML(格式不正确)

时间:2013-06-04 10:03:07

标签: java html jsoup

我正在尝试使用Jsoup解析HTML页面并创建一些奇怪的问题。 该页面为:http://www.filmaffinity.com/en/film290741.html,您可以看到不是well formed。它有一些问题,我猜可以影响解析。    通过Firebug和Chrome,我已经获得了我正在寻找的元素的XPath(页面中的5.8率)。

  • Chrome指向: /html/body/table[2]/tbody/tr/td[2]/table/tbody/tr[1]/td/table[1]/tbody/tr/td[2]/table/tbody/tr[2]/td

  • Firebug指出: /html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td

    唯一的区别是Chrome中的1未在Firebug中显示。我手动验证了路径,这是正确的。

然后我在Jsoup中将xpath转换为CSS查询,以便稍后提取特定元素:

Element rate=doc.select("html body table:nth-child(2) tbody tr td:nth-child(2) table tbody tr td table tbody tr td:nth-child(2) table tbody tr:nth-child(2) td") 

代码的执行不能正确定位我,而是定位到Firebug在XPath中引用的元素:

wrong:/html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[15]/td[2]
    right:/html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td

从最后开始,第一个区别是:

  

/ TD /表/ tbody的/ TR [15] / TD [2]

它取第一个元素而不是第二个元素。

有没有办法解决这类问题?与html相关的问题是否格式不正确,或者我是否遗漏了其他一些我可以用来解决此问题的Jsoup技术?

我选择了Jsoup,因为它应该能够处理不完善的Html。我要求太高了吗?

Jsoup还有其他方法可以解决这类问题吗?

2 个答案:

答案 0 :(得分:1)

你快到了!

问题是(正如你所提到的)你提供给select()的表达式匹配两个元素。我通过在Chrome开发控制台中执行JQuery来检查这一点。

select()会返回Elements,因此您只能访问rate.get(1),但这并不能很好地阅读。因此,您可以为查询添加更多细化,以便获得您所追求的评分:

Element rate=doc.select("html body table:nth-child(2) tbody tr td:nth-child(2) table tbody tr td table tbody tr td:nth-child(2) table tbody tr:nth-child(2) td[align=center]").first();

哪个有效,因为其他td不居中。

答案 1 :(得分:0)

我无法找到“科学”的解决方案。相反,我已经搜索了其他方法来定义元素(基于不同的属性和元素)。

这不是一个优雅的解决方案,但它有效。

卓越的JSoup支持Selector的很多选项。唯一的缺点是,处理不完善的HTML所谓的先进能力并不是那么先进。