Jsoup:select()在不应该返回时返回空

时间:2011-10-09 18:44:05

标签: java css-selectors html-parsing jsoup

我想在Wikipedia的Google条目页面上选择信息框:http://en.m.wikipedia.org/wiki/Google

所以,我打电话给:

contentDiv = document.select("div[id=content]").first();

哪个按预期工作,然后我做:

Elements infoboxes = contentDiv.select("table[class=infobox]");

然后我检查infoboxes.isEmpty(),我震惊地发现它是空的!

我检查并验证了元素contentDiv包含以下内容:

<table class="infobox vcard" style="width: 22em;" cellspacing="5">

那么,为什么contentDiv.select("table[class=infobox]")会返回空的???

更新:我使用contentDiv.select("table[class=infobox vcard]")对上述内容进行了测试,效果很好!这很奇怪,因为我知道,与table.infobox.vcard符号只选择完全多类元素不同,table[class=infobox]应该选择至少的所有表infobox列出的课程。

BTW,我使用a different Wikipedia entry测试了代码,其中包含:

<table class="infobox biota" style="text-align: left; width: 200px; font-size: 100%;">

contentDiv.select("table[class=infobox]")表现完全符合预期,将该表元素作为infoboxes中的第一项返回。

任何想法为什么不一致?什么可以解释这种奇怪的行为?

我是否有可能偶然发现一个Jsoup错误?

(我使用的是jsoup-1.5.2,不是最新的,但我不需要HTML5支持,由于种种原因,我无法立即升级到最新的1.6.1。)

1 个答案:

答案 0 :(得分:8)

[attributename=attributevalue]选择器是完全匹配。这在CSS selector spec(强调我的)中指定:

  

[att=val]
  当元素的“att”属性值完全“val”时匹配。

您想要使用[attributename~=attributevalue]代替:

Elements infoboxes = contentDiv.select("table[class~=infobox]");
// ...

或者更确切地说,.classname选择器:

Elements infoboxes = contentDiv.select("table.infobox");
// ...

另见:


关于您使用不同维基百科条目的测试,我无法重现这一点。但我可以说这个页面包含另一个<table class="infobox">,它必须是您实际检索的那个。