2015-01-21 2 views
2

У меня есть HTML как это:Как соответствовать ближайшему тегу назад с XPath

html =<<EOS 
<table><!-- outer table --> 
    <tr><td> 
    <table><!-- inner table 1 --> 
     <tr><td>Foo</td></tr> 
    </table> 
    <table><!-- inner table 2 --> 
     <tr><td>Bar</td></tr> 
    </table> 
    </td></tr> 
</table> 
EOS 

Я хочу, чтобы получить изменяющееся значение Bar от статического значения Foo.

С помощью этого кода я могу получить значение.

Nokogiri::HTML(html) 
doc.xpath("//table[tr/td[text()='Foo']]/following-sibling::table//td").text 

И я хотел бы переписать так:

doc.xpath("//table[//td[text()='Foo']]/following-sibling::table//td").text 

Но этот код не работает, потому что //table[//td[text()='Foo']] матчей внешней таблицы не внутренняя таблицы.

Есть ли выражение для nearest backward match в XPath вот так?

//table[(nearest match expression)td[text()='Foo']]

ответ

1

Да, //table[//td[text()='Foo']] дает внешнюю таблицу в качестве первого результата (не только результат), но //table[//td[text()='Foo']]/following-sibling::table//td все еще получает <td>Bar</td>.

Проблемная часть //table[//td[text()='Foo']] находится в передней части td//, потому что он выбирает все дочерние элементы td:

<table> 
    <tr> 
    <td>This is selected</td> 
    <td> 
     <table> 
     <tr> 
      <td>This is also selected</td> 
     </tr> 
     </table> 
    </td> 
    </tr> 
</table> 

Вы должны использовать // только экономно. Я хотел бы использовать выражение

//table[tr/td = 'Foo']/following-sibling::table[1]/tr/td 

EDIT: Как было предложено Phrogz, в Nokogiri, вместо [1] в выражении выше, вы можете использовать at_xpath как в

doc.at_xpath(//table[tr/td = 'Foo']/following-sibling::table/tr/td).text 

только получить первый найденный узел результата. То есть, если вы действительно намереваетесь найти только один узел и если требуемый узел является первым в порядке документа.

+0

Используя 'my_doc.at' или' my_doc.at_xpath', вы можете удалить '[1]' из XPath, правильно? – Phrogz

+0

@Phrogz Возможно, это синтаксис Ruby? Что это значит? –

+1

Используя Nokogiri, методы 'at' и' at_xpath' возвращают только первый элемент соответствия вместо набора узлов. – Phrogz

Смежные вопросы