我正在尝试使用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还有其他方法可以解决这类问题吗?
答案 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所谓的先进能力并不是那么先进。