【问题标题】:Parsing inner tags using Nokogiri使用 Nokogiri 解析内部标签
【发布时间】:2011-05-22 21:59:10
【问题描述】:

我无法解析不规则嵌入的 html 标签。有没有办法从节点中删除所有 html 标签并保留所有文本?

我正在使用代码:

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

【问题讨论】:

  • 我看不到第一个字体标签在哪里关闭。你试过 at('td/font').text 吗?
  • Roman,我更正了输出。它确实会生成关闭字体标签。
  • 好的,你试过 row.at_xpath('td[6]/font').text 吗?
  • 谢谢罗曼。你没看错 - .text 是正确答案的组成部分之一。

标签: ruby parsing internationalization nokogiri


【解决方案1】:

这取决于您需要提取的内容。如果您想要字体元素中的所有文本,您可以使用以下 xpath:

'td/font//text()'

它提取字体标签中的所有文本节点。如果你想要单元格中的所有个文本节点,那么:

'td//text()'

您也可以在 Nokogiri 节点上调用 text 方法:

row.at_xpath(xpath).text

【讨论】:

  • 谢谢马克。 .text 起初抛出错误,因为第一个解析的行是空的。我做了rows.each_with_index.collect 而不是rows.collect 并跳过了第一行。和达达!谢谢!
【解决方案2】:

前几天我为同样的问题添加了一个答案。这是一个非常简单的过程。

看看:Convert HTML to plain text and maintain structure/formatting, with ruby

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多