2015-01-21 37 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 

我想從一個靜態值Foo得到一個變化值Bar

有了這段代碼,我可以獲得價值。

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']]匹配外部表不是內部表。

在XPath中是否有像這樣的表達式nearest backward match

//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 

編輯:如上表達建議的Phrogz,在引入nokogiri,而不是[1],您可以在

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

使用at_xpath爲僅獲取找到的第一個結果節點。也就是說,如果您實際上只打算找到一個節點,並且想要的節點是文檔順序中的第一個。

+0

使用'my_doc.at'或'my_doc.at_xpath'可以從XPath中刪除'[1]',對嗎? – Phrogz 2015-01-21 19:06:55

+0

@Phrogz可能是Ruby語法嗎?這是什麼意思? – 2015-01-21 19:08:07

+1

使用Nokogiri'at'和'at_xpath'方法將僅返回第一個匹配元素,而不是一組節點。 – Phrogz 2015-01-21 19:09:36