如何使用Nokogiri正确处理不间断的空间?

时间:2011-05-10 20:41:00

标签: ruby nokogiri

我正在使用Nokogiri来解析HTML页面,但我遇到了非破坏空间的奇怪问题。我尝试了不同的编码,替换了空白,以及其他一些令人头疼的尝试。

以下是有问题的HTML代码段:

<td>Amount 15,300&nbsp;at&nbsp;dollars</td>

请注意我使用Nokogiri后&nbsp;表示的更改:

<td>Amount 15,300&#xa0;at&#xa0;dollars</td>

输出inner_text

Amount 15,300 at dollars

这是我的基础Nokogiri抓取,我确实尝试了一些替代方案来解决但是失败了:

doc = Nokogiri::HTML(open(url))

然后我为相关项目执行了doc.search

请注意,如果我查看该文档,该行会在该行显示&#xa0;

澄清:我认为我没有明确说明我遇到的困难。如果没有奇怪的inner_text符号,我无法显示Â

3 个答案:

答案 0 :(得分:2)

我知道这已经过时了,但我花了一个小时才找到解决这个问题的方法,一旦你知道就很容易了。只需将您的字符串传递给此函数,它就会被“删除”。

def strip_html(str)
  nbsp = Nokogiri::HTML("&nbsp;").text
  str.gsub(nbsp,'')
end

如果您愿意,也可以用空格替换它。愿你们许多人找到这个答案!

答案 1 :(得分:1)

除非你真的,真的想保留&nbsp;符号,否则这里应该没有问题。

A0是非中断空格的十六进制字符代码。因此,&#xa0;打印一个不间断的空格,完全等同于&nbsp;&#160;也会做同样的事情。

Nokogiri在这里做的是读取文本节点,识别实体,并在内部将它们转换为实际的字符串表示。然后,当将其转换回HTML友好版本的文本节点时,它通过其十六进制代码表示不间断空格,而不是在实体表中查找它的性能开销,因为它无论如何都是等价的。

假设Â正是您所看到的并且不仅仅是粘贴到StackOverflow的问题,这是一个文本编码问题:输出软件(浏览器?)不是UTF-8模式,所以不知道如何处理字符代码A0,它也是最好的。如果这是一个浏览器,将<meta charset="utf-8">添加到头部将解决此问题,并使输出的其余部分更加符合Unicode。

如果您确实想要&nbsp;,请使用gsub在最终输出中替换它们。否则,不要担心。

答案 2 :(得分:0)

正如@sawa所说,主要问题是你在写入控制台时看到的内容。在Nokogiri将其转换为适当的二进制值后,它无法正确显示非中断空格。

解决问题的常用方法是预处理内容:

require 'nokogiri'

html = '<td>Amount 15,300&nbsp;at&nbsp;dollars</td>'
doc = Nokogiri::HTML::DocumentFragment.parse(html.gsub(/&(?:#xa0|#160|nbsp);/i, ' '))
puts doc.to_html

哪个输出:

<td>Amount 15,300 at dollars</td>