标签:java css-selectors html-parsing jsoup
我试图在维基百科的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.infobox.vcard表示法只选择确切的多类元素,table [class = infobox]应该选择在列出的类中至少有信息框的所有表.
顺便说一下,我用a different Wikipedia entry测试了代码,其中包含:
<table class="infobox biota" style="text-align: left; width: 200px; font-size: 100%;">
而且contentDiv.select(“table [class = infobox]”)的行为完全符合预期,将该表元素作为信息框中的第一项返回.
知道为什么不一致吗?什么可以解释这种奇怪的行为?
有可能我偶然发现了一个Jsoup错误吗?
(我使用的是jsoup-1.5.2,不是最新的,但我不需要HTML5支持,由于各种原因,我无法立即升级到最新的1.6.1).
解决方法:
[attributename=attributevalue]
选择器完全匹配.这在CSS selector spec中指定(强调我的):
[att=val]
Match when the element’s “att” attribute value is exactly “val”.
您想要使用[attributename~=attributevalue]
:
Elements infoboxes = contentDiv.select("table[class~=infobox]");
// ...
或者,更好的是,.classname
选择器:
Elements infoboxes = contentDiv.select("table.infobox");
// ...
也可以看看:
> CSS selector spec – attribute selectors – class selectors
> Jsoup selector cookbook
> Jsoup Selector
API
至于您使用不同维基百科条目的测试,我无法重现这一点.但我可以说这个页面包含另一个< table class =“infobox”>这必须是你实际检索的那个.
标签:java,css-selectors,html-parsing,jsoup 来源: https://codeday.me/bug/20190610/1209519.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。