2017-06-05 5 views
-1
<html> 
    <table border="1"> 
     <tbody> 
      <tr> 
       <td> 
        <table border="1"> 
         <tbody> 
          <tr> 
           <th>aaa</th> 
           <th>bbb</th> 
           <th>ccc</th> 
           <th>ddd</th> 
           <th>eee</th> 
           <th>fff</th> 
          </tr> 
          <tr> 
           <td>111</td> 
           <td>222</td> 
           <td>333</td> 
           <td>444</td> 
           <td>555</td> 
           <td>666</td> 
          </tr> 
         </tbody> 
        </table> 
       </td> 
      </tr> 
     </tbody> 
    </table> 
</html> 

Wie kann ich ende spezifische Cousin Daten mit XPath wählen, wäre die gewünschte ausgegeben:Xpath - Wie im Zusammenhang Cousin Daten auszuwählen

<th>aaa</th> 
<th>ccc</th> 
<th>fff</th> 
<td>111</td> 
<td>333</th> 
<td>666</td> 

Der wichtigste Aspekt des XPath ist, dass ich bin so einschließen oder ausschließen bestimmte <th>-Tags und ihre entsprechenden <td> Tags

basierend auf der Lage der Suche auf die Antworten so weit die nächste, die ich habe, ist:

//th[not(contains(text(), "ddd"))] | //tr[2]/td[not(position()=4)] 

Gibt es eine Möglichkeit von nicht explizit position()=4 Verwendung, sondern den entsprechenden th Tag Referenz

+0

Es ist gut, dass Sie XML und die erwartete Ausgabe einbezogen haben, aber Sie haben nicht angegeben, welche Kriterien die erwartete Ausgabe erfüllt - es ist nicht offensichtlich. – kjhughes

+0

Das Kriterium ist, jedes "th" und das entsprechende 'td' auszuwählen, aber" th "auszuschließen, das" bbb "," ddd "," eee "und ihre entsprechenden' td' Tags enthält. – Darth

+0

Welche Programmiersprache verwendest du mit 'selen '? – Andersson

Antwort

0

Ich bin nicht sicher, dass dies die beste Lösung ist, aber Sie könnten

//th[not(.="bbb") and not(.="ddd") and not(.="eee")] | //tr[2]/td[not(position()=index-of(//th, "bbb")) and not(position()=index-of(//th, "ddd")) and not(position()=index-of(//th, "eee"))] 

oder kürzere Version versuchen

//th[not(.=("bbb", "ddd", "eee"))]| //tr[2]/td[not(position()=(index-of(//th, "bbb"), index-of(//th, "ddd"),index-of(//th, "eee")))] 

that returns

<th>aaa</th> 
<th>ccc</th> 
<th>fff</th> 
<td>111</td> 
<td>333</td> 
<td>666</td> 

Sie können die Verwendung komplizierter XPath Ausdrücke vermeiden, um die erforderliche Ausgabe zu erhalten. Versuchen Sie Python + Selenium Funktionen stattdessen zu verwenden:

# Get list of th elements 
th_elements = driver.find_elements_by_xpath('//th') 
# Get list of td elements 
td_elements = driver.find_elements_by_xpath('//tr[2]/td') 
# Get indexes of required th elements - [0, 2, 5] 
ok_index = [th_elements.index(i) for i in th_elements if i.text not in ('bbb', 'ddd', 'eee')] 
for i in ok_index: 
    print(th_elements[i].text) 
for i in ok_index: 
    print(td_elements[i].text) 

Ausgang ist

'aaa' 
'ccc' 
'fff' 
'111' 
'333' 
'666' 

Wenn Sie XPath 1.0 Lösung benötigen:

//th[not(.=("bbb", "ddd", "eee"))]| //tr[2]/td[not(position()=(count(//th[.="bbb"]/preceding-sibling::th)+1, count(//th[.="ddd"]/preceding-sibling::th)+1, count(//th[.="eee"]/preceding-sibling::th)+1))] 
+0

Danke, aber beides XPaths werden in Firepath als ungültig angezeigt? – Darth

+0

Ich schätze Ihren Vorschlag, aber Xpath scheint der effizienteste Weg zu sein. Der HTML-Code, den ich gepostet habe, ist nur ein Ausschnitt einer viel größeren Datei. Ich arbeite mit mehreren HTML-Dateien, die tief verschachtelt sind. Das heißt, Ihre vorherige Antwort ist sehr nah an dem, was ich suche, es ist nur das 'index-of' Funktion funktioniert nicht in XPath 1.0, kennen Sie eine Arbeit um? – Darth

+0

Überprüfen Sie die aktualisierte Antwort – Andersson

0

Mit XPath 3.0 Sie, dass in

let $th := //table/tbody/tr[1]/th, 
$filteredTh := $th[not(. = ("bbb", "ddd", "eee"))], 
$pos := $filteredTh!index-of($th, .) 
return ($filteredTh, //table/tbody/tr[position() gt 1]/td[position() = $pos]) 
strukturieren
+0

Ich benutze Selen so Xpath 1.0 wäre die ideale Lösung, Danke – Darth

Verwandte Themen