如何在<br/>或<br/>之间获取文本的xpath?

时间:2009-09-28 03:55:48

标签: ruby xpath

</div>
apple
<br>
banana
<br/>
watermelon
<br>
orange

假设上述情况,如何使用Xpath抓取每个水果?必须使用某种类型的xpath。

我应该使用substring-after(following-sibling...)吗?

编辑:我正在使用Nokogiri解析器。

3 个答案:

答案 0 :(得分:4)

好吧,您可以使用"//br/text()",但这会返回所有 <br>标记内的文本节点。但由于上面没有格式良好的xml,我不确定你将如何使用xpath。正则表达式通常是html的糟糕选择,但有html(不是xhtml)解析器可用。我毫不犹豫地建议一个红宝石,因为那不是“我的区域”,我只是在谷歌搜索...

答案 1 :(得分:2)

尝试以下操作,将<br>标记的所有文本兄弟都作为从尾随和前导空格中删除的字符串数组:

require 'rubygems'
reguire 'nokogiri'

doc = Nokogiri::HTML(DATA)

fruits =
  doc.xpath('//br/following-sibling::text()
           | //br/preceding-sibling::text()').map do |fruit| fruit.to_s.strip end

puts fruits

__END__
</div>
apple
<br>
banana
<br/>
watermelon
<br>
orange

这是你想要的吗?

答案 2 :(得分:1)

这里有几个问题:

  1. XPath适用于XML - 您的HTML不是XML(基本上,标签不匹配,因此当您为其提供文本时,XML解析器会抛出异常)

  2. XPath通常也可以通过查找标记内的属性来工作。看到你的<br>标签实际上并不包含文字,它们就在它之间,这也很难实现

  3. 因此,你可能想要做的是使用XPath(或类似的)来获取div的内容,然后根据<br>次出现来拆分字符串。

    正如你用ruby标记了这个问题,我建议调查hpricot,因为它是一个非常好的和快速的HTML(和XML)解析库,它应该比使用XPath更加有用

相关问题