2011-04-24 4 views
4

Extraire la valeur href du exemple de code HTML suivant est en avant si la boucle I directement à travers tout et rompre immédiatement après la première:Extrait élément interne sans boucle

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

Je peux certainement le faire quand je peut supposer que la valeur href est identique pour les deux instances de comme dans l'exemple ci-dessus.

Cependant, cette approche échoue si elles ne sont pas identiques et je veux en extraire une spécifique (la première ou la seconde).

Ce qui me porte à la recherche d'un mécanisme qui permet Jsoup « imbriquée »: Jusqu'à présent, je suis familier avec la sélection à un seul niveau comme dans:

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 

Mais je ne peux pas trouver de la documentation ou un exemple pour la sélection à plusieurs niveaux, par exemple

Element link= doc.select("div.xpns.div.ptctainer.div.ptitle.p.ptypead.span.rtext"); 

Ce qui précède est à titre d'illustration et pas de vraie syntaxe, bien sûr. Je ne sais pas si quelque chose comme ceci est possible (encore) dans Jsoup.

Une telle "sélection imbriquée" existe-t-elle dans Jsoup? Vous ne pouvez pas simplement «enchaîner» les fonctions de sélection?

Répondre

3

Comme:

Element link = doc.select("div.xpns").select("div.ptctainer").select("div.ptitle").select("p.ptypead").select("span.rtext"); 
+0

Bien sûr, je peux mais la forme "chaînée" implique une traversée/analyse moins optimisée. J'espérais peut-être que Jsoup gère un tel scénario de manière optimisée. Merci et +1. – ef2011

+0

L'analyse est toujours lente. Idéalement, vous passez tous ensemble. – Halcyon

+0

J'avais espéré que Jsoup aurait un mécanisme multi-niveau similaire à [l'ancêtre enfant] (http://jsoup.org/cookbook/extracting-data/selector-syntax) qu'il a déjà. Mais il semble que ce n'est pas encore disponible. – ef2011

4

Les sélecteurs jsoup fonctionnent comme CSS. Voir le document Selector pour le support complet.

Vous pouvez faire des sélections de descendants comme ceci:

Element link = doc.select("div.xpns div.ptctainer div.ptitle p.ptypead span.rtext").first(); 

Si le nom de la balise n'a pas d'importance à la sélection, et il vous suffit d'utiliser le nom de classe:

Element link = doc.select(".xpns .ptctainer .ptitle .ptypead .rtext").first(); 

Ces requêtes sont très effiecient.

Questions connexes