使用XPath查找节点中的最后一行

时间:2013-08-16 09:06:01

标签: ruby xpath

我想知道是否有办法总是选择某个元素上方的节点内容?

我要提取以下代码:

<div id="someDiv">
   <h3>Name</h3>
   Some content1
   <br/>
   <br/>
   Address 12345
   <br/>
   09876 City, Country
   <br/>
   <span id="tel_number">12345</span>
</div>

这是XPath,它可以找到范围之上的所有内容:

//div[@id="someDiv"]/span[@id="tel_number"]/preceding-sibling::node()

现在,我需要的是一个XPath,它始终选择跨度上方的内容而不是其他内容(单行)。如果(由于某种原因)缺少跨度<br/>,它也应该有效。

希望有人可以提供帮助!

3 个答案:

答案 0 :(得分:1)

尝试:

(//div[@id="someDiv"]/span[@id="tel_number"]/preceding-sibling::text())[last()]

或者如果你想删除空格

normalize-space((//div[@id="someDiv"]/span[@id="tel_number"]/preceding-sibling::text())[last()])

答案 1 :(得分:0)

  

我想检索“09876城市,国家/地区”删除任何HTML标记

我认为您正在寻找以下内容:

//div[@id="someDiv"]/span[@id="tel_number"]/preceding-sibling::text()[1]

使用Nokogiri

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse <<-EOT
<div id="someDiv">
   <h3>Name</h3>
   Some content1
   <br/>
   <br/>
   Address 12345
   <br/>
   09876 City, Country
   <br/>
   <span id="tel_number">12345</span>
</div>
EOT

doc.xpath("normalize-space(//div[@id='someDiv']/span[@id='tel_number']/preceding-sibling::text()[1])").to_s
# => "09876 City, Country"

答案 2 :(得分:0)

我发现检索邮政编码的最佳方法如下:

data = page.search('(//div[@id="someDiv"]/span[@id="tel_number"]/preceding-sibling::node()').map{|data| data.text.cleanup}
data.delete("")
postcode = data.last.match(/\d{5}/).to_s

从那里可以轻松地在选择之后或之前检索所有内容。