提取内部元素而不循环

时间:2011-04-24 15:38:23

标签: html html-parsing jsoup

如果我遍历所有 并在第一个之后立即中断,则从以下示例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中是否存在这样的“嵌套选择”?

2 个答案:

答案 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");