nokogiri在文本中失败

时间:2011-11-25 10:13:53

标签: ruby nokogiri

我正在尝试从html中提取文本。

doc = Nokogiri::HTML('<B> <A href="http://www.asl.com/foo/bar"> Status :</A></B> REGISTERED <BR>')

puts doc.search('//b').first.text
puts doc.search('//b[contains(text(),"Status")]/following-sibling::text()[1]').first.text

第一个放回Status : 但是第二次抛出异常undefined method 'text' for nil:NilClass

为什么contains无法正常搜索? 或者我做错了什么?

2 个答案:

答案 0 :(得分:1)

“状态:”实际上不是<B></B>内的文本节点,它是<A></A>内的文本节点。

doc.search('//b/a[contains(text(),"Status")]/text()[1]').first.text

适合我。

答案 1 :(得分:1)

我认为你对XPath中的text函数有错误的想法。与DOM函数不同,它不返回所有文本子节点的串联字符串。相反,它选择单个文本节点。

在您的示例//text()中将选择三个文本节点:

 [" ", " Status :", " REGISTERED "]

您可能需要的是此XPath表达式:

//b/a[contains(text(),"Status")]/../following-sibling::text()[1]

基本上它会找到具有正确文本节点的a元素,而不是走到父元素(b)然后获取其兄弟文本节点。