使用Nokogiri解析内部标签
问题描述:
我被卡住不能不规则地解析嵌入的html标签。有没有办法从节点中删除所有html标签并保留所有文本?使用Nokogiri解析内部标签
我正在使用的代码:
rows = doc.search('//table[@id="table_1"]/tbody/tr')
details = rows.collect do |row|
detail = {}
[
[:word, 'td[1]/text()'],
[:meaning, 'td[6]/font'],
].collect do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end
detail
end
使用XPath:
[:meaning, 'td[6]/font']
产生
:meaning: ! '<font size="3">asking for information specifying <font
color="#CC0000" size="3">what is your name?</font> /what/ as in, <font color="#CC0000" size="3">I'm not sure what you mean</font>
/what/ as in <a style="text-decoration: none;" href="http://somesecretlink.com">what</a></font>
在另一方面,使用XPath:
'td/font/text()'
生成
:meaning: asking for information specifying
从而忽略了节点的所有子。我想达到的是这
:meaning: asking for information specifying what is your name? /what/ as in, I'm not sure what you mean /what/ as in what? I can't hear you
答
这取决于你需要提取什么。如果你想在字体元素的所有文字,你可以用下面的XPath做到这一点:
'td/font//text()'
它提取的字体标记所有文本节点。如果你想小区内所有文本节点,则:
'td//text()'
您也可以拨打引入nokogiri节点上text
方法:
row.at_xpath(xpath).text
+0
谢谢马克。首先,'.text'引发错误,因为第一个解析的行是空的。我做了'rows.each_with_index.collect'而不是'rows.collect'并跳过了第一行。而ta-da!谢谢! – PunjCoder 2011-05-23 01:35:52
答
我添加了一个答案这同一类问题另一天。这是一个非常简单的过程。
看看:Convert HTML to plain text and maintain structure/formatting, with ruby
我不明白哪来的第一个字体标记被关闭。你试过('td/font')。text? – Roman 2011-05-22 22:15:20
Roman,我纠正了输出。它确实生成关闭字体标签。 – PunjCoder 2011-05-22 22:36:07
好吧,你是否尝试做row.at_xpath('td [6]/font').text? – Roman 2011-05-22 22:49:17