4

次のサンプル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値が同一であると想定できる場合は、確かにそれを行うことができます。上記の例のように。

ただし、これらが同一でなく、特定のアプローチ(最初または2番目のいずれか)を抽出したい場合、このアプローチは失敗します。

これにより、「ネストされた選択」を可能にする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に存在しますか?

4

2 に答える 2

4

jsoupセレクターはCSSと同じように機能します。完全なサポートについては、セレクタのドキュメントを参照してください。

次のような子孫の選択を行うことができます。

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();

これらのクエリは非常に効率的です。

于 2011-04-29T03:51:44.690 に答える
3

選択機能を「チェーン」することはできませんか?好き:

Element link = doc.select("div.xpns").select("div.ptctainer").select("div.ptitle").select("p.ptypead").select("span.rtext");
于 2011-04-24T19:52:39.607 に答える