我想在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。)
答案 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");
// ...
Selector
API 关于您使用不同维基百科条目的测试,我无法重现这一点。但我可以说这个页面包含另一个<table class="infobox">
,它必须是您实际检索的那个。