我想知道是否有办法总是选择某个元素上方的节点内容?
我要提取以下代码:
<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/>
,它也应该有效。
希望有人可以提供帮助!
答案 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
从那里可以轻松地在选择之后或之前检索所有内容。