2017-03-22 2 views
1
<div> 
    <pre> 
     <span class="attr">id:</span> 
     <span class="text">1</span> 
     <span class="attr">time:</span> 
     <span class="text">42</span> 
     <span class="attr">length:</span> 
     <span class="text">74</span> 

     <span class="attr">id:</span> 
     <span class="text">2</span> 
     <span class="attr">time:</span> 
     <span class="text">57</span> 
     <span class="attr">length:</span> 
     <span class="text">74</span> 
    </pre> 
</div> 

Hier ist ein Modell von HTML, mit dem ich arbeite. Ich versuche, XPath zu verwenden, um die Höhe der Zeit zu finden, die mit der ID zugeordnet ist: 1, und nur id: 1, nicht-ID: 2.Kann die Folge-Geschwisterachse mehrfach in XPath verwendet werden?

//span[@class = 'attr'][text()='id:']/following-sibling::span[1][text()='1'] 

bekommt richtig ‚1‘ Element für ID für mich , aber mein Versuch

//span[@class = 'attr'][text()='id:']/following-sibling::span[1][text()='1']/following-sibling::span[1][text()='time:']/following-sibling::span[1] 

, um die Zahl nach der Zeit nach id zu greifen zu tun: 1 nicht für mich arbeiten. Ich brauche den xpath, um nur die Zeiten nach einer bestimmten ID zu identifizieren, also wird die Verwendung einer einzigen folgenden ID nach dem time-Element für mich nicht funktionieren, da es auch die ID finden muss. Ist es überhaupt möglich, Folge-Geschwister zweimal hintereinander zu machen? Gibt es einen besseren Weg, dies zu tun?

+2

Sicher, können Sie 'folgenden- Geschwister :: 'mehrmals. Ich habe Ihre XPaths getestet und beide funktionieren. Was meinst du mit "wird nicht für mich arbeiten"? – kjhughes

+0

Entschuldigung, sieht so aus. Auf meinen echten Code war nur verwirrend welche Nummer ich nach der letzten Spanne setzen sollte. Danke trotzdem :) – Keenan

Antwort

1

Ja, Sie können die Achse following-sibling:: mehrmals verwenden.

Ihr XPath funktioniert wie vorgesehen. Angesichts das Layout Ihrer HTML, gibt es nicht viel Sie durch die Verkürzung der XPath andere tun können, als es vielleicht den String-Wert der spans eher als Kind text() Knoten zu verwenden:

//span[@class='attr'][.='id:']/following-sibling::span[1][.='1'] 
           /following-sibling::span[1][.='time:'] 
           /following-sibling::span[1] 
+0

Gibt es einen Unterschied zwischen der Verwendung von [text() = '1'] und [. = '1'], außer dass die zweite einfacher zu schreiben ist? Danke – Keenan

+0

Ja, auf jeden Fall sind sie im Allgemeinen unterschiedlich, aber in Ihrem Fall wird es nicht wichtig sein. Zum Verständnis der Unterschiede siehe [** XPath text() = unterscheidet sich von XPath. = **] (http://stackoverflow.com/q/34593753/290085) – kjhughes

+0

Cool, danke;) – Keenan

Verwandte Themen