如果我遍历所有 并在第一个之后立即中断,则从以下示例HTML代码中提取href值是直截了当的:
<li class="parts partname parts_first">
<div id="dpdn10" uri="/public/page/part1" class="partype partstate">
<div class="ptctainer">
<div class="ptitle">
<p class="ptypead">
<span class="rtext"><a href="http://www.example.com/page/ptname.html?dv=rfirst" class="mnLabel">First</a></span>
<span class="ndx">
<a href="#" dndx="dpdn10" class="xpnd _t" style="opacity:1">Details: </a>
</span>
</p>
</div>
</div>
<div id="dpdn10_content" class="xpns">
<div class="ptctainer">
<div class="ptitle">
<p class="ptypead">
<span class="rtext"><a href="http://www.example.com/page/ptname.html?dv=rfirst" class="mnLabel">First</a></span>
<span class="ndx"><a href="#" class="xpnd">Details: </a></span>
</p>
</div>
</div>
</div>
</div>
</li>
当我可以假设href值对于 的两个实例都是相同的时,我可以这样做。如上例所示。
然而,如果它们不相同并且我想提取特定的(第一个或第二个),这种方法就会失败。
这使我在Jsoup中搜索允许“嵌套选择”的机制:到目前为止,我已熟悉单级选择,如:
Elements links = doc.select("a[href]"); // a with href
Elements pngs = doc.select("img[src$=.png]"); // img with src ending .png
Element masthead = doc.select("div.masthead").first(); // div with class=masthead
但我无法找到多级选择的文档或示例,例如
Element link= doc.select("div.xpns.div.ptctainer.div.ptitle.p.ptypead.span.rtext");
以上是为了说明而不是真正的语法。我不知道Jsoup中是否还有这样的东西。
Jsoup中是否存在这样的“嵌套选择”?
答案 0 :(得分:4)
jsoup选择器就像CSS一样工作。有关完整支持,请参阅Selector文档。
你可以做这样的后代选择:
Element link = doc.select("div.xpns div.ptctainer div.ptitle p.ptypead span.rtext").first();
如果标签名称对选择不重要,您只需要使用类名:
Element link = doc.select(".xpns .ptctainer .ptitle .ptypead .rtext").first();
这些查询非常有效。
答案 1 :(得分:3)
难道你不能只是'链接'选择功能吗?像:
Element link = doc.select("div.xpns").select("div.ptctainer").select("div.ptitle").select("p.ptypead").select("span.rtext");