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

Reg*_*kie 4 java css-selectors html-parsing jsoup

我试图在维基百科的谷歌入口页面上选择信息框:http://en.m.wikipedia.org/wiki/Google

所以,我打电话给:

contentDiv = document.select("div[id=content]").first();
Run Code Online (Sandbox Code Playgroud)

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

Elements infoboxes = contentDiv.select("table[class=infobox]");
Run Code Online (Sandbox Code Playgroud)

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

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

<table class="infobox vcard" style="width: 22em;" cellspacing="5">
Run Code Online (Sandbox Code Playgroud)

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

更新:我测试了以上,contentDiv.select("table[class=infobox vcard]")它工作正常!这很奇怪,因为我知道,与table.infobox.vcard仅选择精确多类元素的符号不同,table[class=infobox]应该选择至少 infobox在其列出的类中的所有表.

顺便说一下,我用不同的维基百科条目测试了代码,其中包含:

<table class="infobox biota" style="text-align: left; width: 200px; font-size: 100%;">
Run Code Online (Sandbox Code Playgroud)

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

知道为什么不一致吗?什么可以解释这种奇怪的行为?

有可能我偶然发现了一个Jsoup错误吗?

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

Bal*_*usC 8

所述[attributename=attributevalue]选择器是一个精确的匹配.这是在CSS选择器规范(强调我的)中指定的:

[att=val]
        当元素的"att"属性值恰好为 "val" 时匹配.

你想用[attributename~=attributevalue]而不是:

Elements infoboxes = contentDiv.select("table[class~=infobox]");
// ...
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,.classname选择器:

Elements infoboxes = contentDiv.select("table.infobox");
// ...
Run Code Online (Sandbox Code Playgroud)

也可以看看:


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