0

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

  • 铬指出: /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 /table/tbody/tr[15]/td[2]

它需要第一个元素而不是第二个元素。

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

我选择 Jsoup 是因为它应该能够处理格式不正确的 Html。我要求太高了吗?

Jsoup 有什么替代品可以解决这类问题吗?

4

2 回答 2

1

你快到了!

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

select()返回 anElements因此您可以访问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没有居中。

于 2013-06-06T05:58:45.840 回答
0

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

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

JSoup 支持这么多的 Selector 选项真是太好了。唯一的缺点是处理格式不正确的 HTML 的所谓高级功能并没有那么先进。

于 2013-06-10T00:09:03.883 回答