(Обратный) Traverse XPath Query для доступа к DIV с определенным текстовым значением - PullRequest
0 голосов
/ 05 марта 2019

Работа с DOM, который имеет один и тот же цикл HTML более 100 раз, который выглядит следующим образом

<div class="intro"> 
  <div class="header"> 
     <h1 class="product-code"> <span class="code">ZY001</span> <span class="intro">ZY001 Title/Intro</span> </h1> 
  </div> 
<div> 
<table> 
<tbody>
   <tr> 
        <td>Available</td>
        <td> S </td>
        <td> M </td>
        <td> XL </td>
  </tr> 

Я ранее использовал этот запрос XPath, чтобы вернуть ВСЕ значения узла (все 100+ экземпляров)запроса DOM в связи с узлами переменных, которые могут содержать в Available

//div[@class='intro']/div/table/tbody/tr/td[contains(text(),'Available')]/following-sibling::td

объект (DOMNodeList) [595] public 'length' => int 591

Теперь мне нужно нацелиться на product-code / code специально, чтобы получить все атрибуты td для определенного code

, поскольку div, который содержит уникальный идентификатор (в примеревыше, ZY001) не является прямым предком, я думаю, что я должен сделать обратный XPath-запрос

Вот одна из моих попыток:

//h1[@class='product-code']/span[contains(@class, 'code') and text() = 'ZY001']/../../div[@class='intro']/div/table/tbody/tr/td[contains(text(),'Available')]/following-sibling::td

Как я определяю /span[contains(@class, 'code') and text() = 'ZY001'] и затем дважды пытался пройти через дом, используя /../../ Я надеялся / ожидал вернуть div [@ class = 'intro'] с текстом ZY001 непосредственно над ним, или, скорее, public 'length' => int 1

Но все мои попытки до сих пор привели меняn 0 результаты.Не false, что указывает на неправильный XPath, но 0.

Как я могу изменить мой XPath Query, чтобы получить единственный экземпляр в одном из множества <div class="intro">, которые содержат <h1 class="product-code"> / <span class="code"> текстовое значение ZY001?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Для этого вы можете использовать любой из следующих xpath:

//div[@class='intro' and //h1[@class='product-code']/span[@class='code' and text()='ZY001']]//tbody/tr[td[text()='Available']]/td[2]

//div[@class='intro' and //span[@class='code' and text()='ZY001']]//tbody/tr[td[text()='Available']]/td[2]

//div[@class='intro' and //span[@class='code' and text()='ZY001']]//tr[td[text()='Available']]/td[2]

Измените td[2] на td[3] и td[4], чтобы получить 3-й и 4-й td соответственно

0 голосов
/ 05 марта 2019

Используйте

//h1[@class='product-code']/span[contains(@class, 'code') and text() = 'ZY001']/../../../div/table/tbody

вместо

//h1[@class='product-code']/span[contains(@class, 'code') and text() = 'ZY001']/../../div[@class='intro']/div/table/tbody
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...