首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nokogiri、open-uri和Unicode字符

Nokogiri、open-uri和Unicode字符
EN

Stack Overflow用户
提问于 2010-04-03 19:28:43
回答 8查看 22.5K关注 0票数 27

我使用Nokogiri和open在网页上获取标题标签的内容,但是在重音字符方面有问题。处理这些问题最好的方法是什么?我正在做的事情是:

代码语言:javascript
复制
require 'open-uri'
require 'nokogiri'

doc = Nokogiri::HTML(open(link))
title = doc.at_css("title")

此时,标题如下:

Rag\303\271

而不是:

Rag 15个

我怎样才能让nokogiri返回正确的角色(例如,在这种情况下)?

下面是一个URL示例:

http://www.epicurious.com/recipes/food/views/Tagliatelle-with-Duck-Ragu-242037

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-04-03 20:06:52

当你说“看起来像这样”时,你是在查看这个值IRB吗?它将使用表示字符的字节序列的C样式转义来转义非ASCII范围字符。

如果您使用puts打印它们,您将像预期的那样返回它们,假设您的shell控制台使用的编码与所讨论的字符串相同(在本例中,基于该字符返回的两个字节,显然是UTF-8 )。如果将值存储在文本文件中,打印到句柄上也应该会产生UTF-8序列。

如果您需要在UTF-8和其他编码之间进行转换,那么具体情况取决于您使用的是Ruby1.9还是1.8.6。

对于1.9:http://blog.grayproductions.net/articles/ruby_19s_string 1.8,您可能需要查看Iconv。

此外,如果您需要与Windows中的COM组件交互,则需要告诉ruby使用正确的编码方式,如下所示:

代码语言:javascript
复制
require 'win32ole'

WIN32OLE.codepage = WIN32OLE::CP_UTF8

如果要与mysql交互,则需要将表上的排序规则设置为支持正在使用的编码的排序规则。通常,最好将排序规则设置为UTF-8,即使您的一些内容正在以其他编码形式返回;您只需要根据需要进行转换。

Nokogiri有一些处理不同编码的特性(可能是通过Iconv),但是我有点不习惯,所以我会让其他人来解释。

票数 11
EN

Stack Overflow用户

发布于 2011-01-15 20:47:21

摘要:在通过open向Nokogiri提供UTF-8时,使用open(...).read并将结果字符串传递给Nokogiri。

分析:如果我使用curl获取页面,则标题正确地显示Content-Type: text/html; charset=UTF-8,文件内容包括有效的UTF-8,例如"Genealogía de Jesucristo"。但是,即使对Ruby文件进行了神奇的注释并设置了文档编码,这也是没有好处的:

代码语言:javascript
复制
# encoding: UTF-8
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI'))
doc.encoding = 'utf-8'
h52 = doc.css('h5')[1]
puts h52.text, h52.text.encoding
#=> Genealogà a de Jesucristo
#=> UTF-8

我们可以看到,这不是open的错:

代码语言:javascript
复制
html = open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI')
gene = html.read[/Gene\S+/]
puts gene, gene.encoding
#=> Genealogía
#=> UTF-8

这是一个诺科吉里的问题,当处理开放-uri,似乎。这可以通过将HTML作为原始字符串传递给Nokogiri来解决:

代码语言:javascript
复制
# encoding: UTF-8
require 'nokogiri'
require 'open-uri'

html = open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI')
doc = Nokogiri::HTML(html.read)
doc.encoding = 'utf-8'
h52 = doc.css('h5')[1].text
puts h52, h52.encoding, h52 == "Genealogía de Jesucristo"
#=> Genealogía de Jesucristo
#=> UTF-8
#=> true
票数 62
EN

Stack Overflow用户

发布于 2011-01-24 13:37:24

我也有同样的问题,而Iconv的方法不起作用。Nokogiri::HTMLNokogiri::HTML.parse(thing, url, encoding, options)的别名。

所以,你只需要做:

doc = Nokogiri::HTML(open(link).read, nil, 'utf-8')

它将正确地将页面编码转换为utf-8。您将看到Ragù而不是Rag\303\271

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2572396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档