【问题标题】:Jsoup: select() returns empty when it shouldn'tJsoup:select()不应该返回空
【发布时间】:2011-12-04 01:50:27
【问题描述】:

我正在尝试选择 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]") 测试了上面的内容,它工作正常!这很奇怪,因为我知道与只选择 exact 多类元素的 table.infobox.vcard 表示法不同,table[class=infobox] 应该选择所有具有 至少 infobox 的表他们列出的类。

顺便说一句,我用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)。

【问题讨论】:

    标签: java css-selectors html-parsing jsoup


    【解决方案1】:

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

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

    您想改用[attributename~=attributevalue]

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

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

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

    另见:


    至于您使用不同的维基百科条目进行的测试,我无法重现这一点。但我可以看出此页面包含另一个&lt;table class="infobox"&gt;,它一定是您实际检索的那个。

    【讨论】:

    • 我一定是个白痴:我一直都在关注tag.["class=classname"]精确匹配)符号与tag.classname(不精确)符号,但我交换了它们,然后浪费了太多时间来弄清楚发生了什么。 +25。
    猜你喜欢
    • 2017-05-18
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2012-05-14
    相关资源
    最近更新 更多