2009-07-07 10 views
25

Używam pakietu Agility Pack Html do uruchamiania zapytań xpath na stronie internetowej. Chcę znaleźć wiersze w tabeli, które zawierają pewien interesujący element. W poniższym przykładzie chcę pobrać drugi wiersz.Zapytanie Xpath, aby znaleźć elementy, które zawierają określonego potomka

<table name="important"> 
<tr> 
    <td>Stuff I'm NOT interested in</td> 
</tr> 
<tr> 
    <td>Stuff I'm interested in</td> 
    <td><interestingtag/></td> 
    <td>More stuff I'm interested in</td> 
</tr> 
<tr> 
    <td>Stuff I'm NOT interested in</td> 
</tr> 
<tr> 
    <td>Stuff I'm NOT interested in</td> 
</tr> 
</table> 

szukam zrobić coś takiego:

//table[@name='important']/tr[has a descendant named interestingtag] 

Z wyjątkiem poprawnej składni XPath. ;-)

Przypuszczam, że mógłbym po prostu znaleźć interesujący element, a następnie pracować z łańcuchem nadrzędnym od węzła, który powrócił, ale wydawało mi się, że powinien istnieć sposób na zrobienie tego w jednym kroku i jestem po prostu gęsta.

Odpowiedz

46

"ma potomka o nazwie interestintag" jest pisane .//interestintag w XPath, więc wyrażenie szukasz jest:

//table[@name='important']/tr[.//interestingtag] 
19

Faktycznie, trzeba spojrzeć na potomka, a nie dziecko:

//table[@name='important']/tr[descendant::interestingtag] 
+0

lub sposób @ mirod też by działał. :-) –

+0

Doskonały. To bardzo pomocne. Niestety nie mogę przyjąć dwóch odpowiedzi! –

+2

Zawsze uważam za zabawne, jak wiele sposobów na uzyskanie pożądanego wyniku w XPath. Wierzę, że // table [@ name = 'important'] // interestingtag // ancestor :: tr powinien również działać. – mirod

8

wiem, to nie jest to, co PO pytał, ale jeśli chce znaleźć element, który miał potomka ze szczególnym atrybutu, można zrobić coś takiego:

//table[@name='important']/tr[.//*[@attr='value']] 
+1

ale to właśnie szukałem, dziękuję! – Nils

Powiązane problemy