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).
所述[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">必须是你实际检索的页面.
| 归档时间: |
|
| 查看次数: |
2510 次 |
| 最近记录: |