我正在尝试从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
无法正常搜索?
或者我做错了什么?
答案 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
)然后获取其兄弟文本节点。