Извлечь внутренний элемент без зацикливания

Извлечение значения href из следующего примера HTML-кода выполняется прямолинейно, если я перебираю все и прерываю сразу после первого:

  <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?


person ef2011    schedule 24.04.2011    source источник


Ответы (2)


Разве вы не можете просто «связать» функции выбора? Нравится:

Element link = doc.select("div.xpns").select("div.ptctainer").select("div.ptitle").select("p.ptypead").select("span.rtext");
person Halcyon    schedule 24.04.2011
comment
Конечно, я могу, но цепная форма подразумевает менее оптимизированный обход/анализ. Я надеялся, что, возможно, Jsoup оптимальным образом справится с таким сценарием. Спасибо и +1. - person ef2011; 25.04.2011
comment
Разбор всегда медленный. В идеале вы бы пропустили все это вместе. - person Halcyon; 25.04.2011
comment
Я надеялся, что Jsoup будет иметь многоуровневый механизм, аналогичный его предку-потомку. уже есть. Но кажется, что это еще не доступно. - person ef2011; 26.04.2011

Селекторы 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();

Эти запросы очень эффективны.

person Jonathan Hedley    schedule 29.04.2011