【发布时间】:2011-01-28 18:26:21
【问题描述】:
我正在使用 Nokogiri 解析外部 HTML 页面。该页面使用 ISO-8859-1 编码。我要提取的部分数据,包含一些-(破折号)html实体:
xml = Nokogiri.HTML(open("http://flybynight.com.br/agenda.php"), nil, 'ISO-8859-1')
f = xml.xpath("//div[@style='background-color:#D9DBD9; padding:15px 12px 10px 10px;']//div[@class='tit_inter_cnz']/text()")
f[0].text #=> Preview M/E/C/A \u0096 John Digweed
在最后一行,字符串应该在浏览器上用 dash 呈现。如果我将我的页面指定为 ISO-8859-1 编码,浏览器会正确呈现它,但是,我的 Sinatra 应用程序使用 UTF-8。如何在浏览器中正确显示该文本?今天被显示为一个正方形,里面有一个小数字。 我尝试了 force_encoding('ISO-8859-1'),但随后我从 Sinatra 收到了 CompatibilityError。
有什么线索吗?
[编辑] 以下是应用截图:
-> 字符编码为 UTF-8 的 Firefox
-> [Firefox 字符编码为 Western (ISO-8859-1)
值得一提的是,在上面的 ISO-8859-1 模式下,破折号显示正确,但破折号之前还有另一个不正确的字符。奇怪:(
【问题讨论】:
-
这是迄今为止调查的一个提示:
puts [xml.encoding, f[0].text.encoding] #=> ["ISO-8859-1", #<Encoding:UTF-8>]我不确定为什么 libxml 或 Nokogiri 将来自 XML 的文本值视为 UTF-8。即使您修改 XPath 以获取 div 而不是文本节点,也会发生这种情况。即使在文档中使用#encoding: ISO-8859-1魔术注释也会发生这种情况。 -
没错,Phrogz。尽管文档编码为 ISO-8859-1,Nokogiri 始终以 UTF-8 格式提供节点文本
-
您可以在调用
.text的结果上#force_encoding('ISO-8859-1'),然后干净地转换为UTF-8 ...但我还不相信您的源文档是有效的ISO-8859- 1. -
“我还不相信您的源文档是有效的 ISO-8859-1” 我同意。破折号之前的角色是确凿的证据。正确编码的 HTML 不会有这种情况。我认为问题出在 Nokogiri 和 HTTPd 服务器的上游,无论是在渲染应用程序中还是在 HTML 生成中。复制 Word 文档并将它们粘贴到页面布局程序中就可以做到这一点,上游的不良抓取代码也是如此。
-
是的,非常糟糕的布局,很难刮