1

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

我有以下要从中提取的代码:

<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,它总是选择 span 正上方的内容,没有其他内容(单行)。如果(由于某种原因)<br/>上面的跨度丢失,它也应该工作。

希望有人可以帮助解决这个问题!

4

3 回答 3

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()])
于 2013-08-16T09:34:57.570 回答
0

我想检索去掉任何 HTML 标记的“09876 City, Country”

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

//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"
于 2013-08-16T09:26:36.440 回答
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

从那里很容易在选择之后或之前检索所有内容。

于 2013-08-16T10:58:48.617 回答