2011-05-22 92 views
0

我被卡住不能不规则地解析嵌入的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 
+0

我不明白哪来的第一个字体标记被关闭。你试过('td/font')。text? – Roman 2011-05-22 22:15:20

+0

Roman,我纠正了输出。它确实生成关闭字体标签。 – PunjCoder 2011-05-22 22:36:07

+0

好吧,你是否尝试做row.at_xpath('td [6]/font').text? – Roman 2011-05-22 22:49:17

回答

0

这取决于你需要提取什么。如果你想在字体元素的所有文字,你可以用下面的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