我正在尝试从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
第一个put返回Status :
但是第二个put抛出一个异常undefined method 'text' for nil:NilClass
为什么contains
不能正常搜索?还是我做错了什么?
我认为您对XPath中的text
函数有错误的理解。与DOM函数不同,它不返回所有文本子节点的连接字符串。相反,它选择单独的文本节点。
//text()
将选择三个文本节点:
[" ", " Status :", " REGISTERED "]
您可能需要这样的XPath表达式:
//b/a[contains(text(),"Status")]/../following-sibling::text()[1]
基本上,它找到具有正确文本节点的a
元素,然后走到父元素(b
),然后获得其兄弟文本节点。
"Status: "实际上不是<B></B>
中的文本节点,而是<A></A>
中的文本节点。
doc.search('//b/a[contains(text(),"Status")]/text()[1]').first.text