Nokogiri, открытый uri и Символы Unicode

Я использую Nokogiri, и открытый uri для захвата содержания заголовка наклеивают веб-страницу, но испытываю затруднения из-за символов с диакритикой. Что лучший способ состоит в том, чтобы иметь дело с ними? Вот то, что я делаю:

require 'open-uri'
require 'nokogiri'

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

На данном этапе заголовок похож на это:

Rag\303\271

Вместо:

Ragù

Как у меня может быть возврат nokogiri надлежащий символ (например, ù в этом случае)?

Вот URL в качестве примера:

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

25
задан Phrogz 15 January 2011 в 21:03
поделиться

4 ответа

Когда вы говорите «выглядит вот так», просматриваете ли вы это значение IRB? Он будет экранировать символы диапазона, отличные от ASCII, с помощью экранирования в стиле C байтовых последовательностей, представляющих символы.

Если вы напечатаете их с помощью put, вы получите их обратно, как вы ожидали, предполагая, что ваша консоль оболочки использует ту же кодировку, что и рассматриваемая строка (в данном случае, по-видимому, UTF-8, на основе двух байтов, возвращенных для этот персонаж). Если вы сохраняете значения в текстовом файле, печать на дескриптор также должна приводить к последовательностям UTF-8.

Если вам нужно выполнить перевод между UTF-8 и другими кодировками, особенности зависят от того, используете ли вы Ruby 1.9 или 1.8.6.

Для 1.9: http://blog.grayproductions.net/articles/ruby_19s_string для 1.8, вам, вероятно, потребуется взглянуть на Iconv.

Кроме того, если вам нужно взаимодействовать с COM-компонентами в Windows, вам нужно указать ruby, чтобы он использовал правильную кодировку, примерно следующим образом:

require 'win32ole'

WIN32OLE.codepage = WIN32OLE::CP_UTF8

Если вы взаимодействуете с mysql, вам необходимо установите параметры сортировки в таблице так, чтобы они поддерживали кодировку, с которой вы работаете. В общем, лучше установить сопоставление в UTF-8, даже если часть вашего контента возвращается в других кодировках; вам просто нужно преобразовать по мере необходимости.

В Nokogiri есть некоторые функции для работы с разными кодировками (возможно, через Iconv), но я немного не практиковался в этом, поэтому я оставлю объяснение кому-нибудь другому.

11
ответ дан 28 November 2019 в 17:37
поделиться

Просто чтобы добавить перекрестную ссылку, эта страница SO дает некоторую связанную информацию:

Как заставить Nokogiri прозрачно возвращать некодированные / закодированные объекты Html нетронутыми?

0
ответ дан 28 November 2019 в 17:37
поделиться

Вам необходимо преобразовать ответ с обрабатываемого веб-сайта (здесь epicurious.com) в кодировку utf-8.

согласно html-содержимому извлекаемой страницы, на данный момент это "ISO-8859-1". Итак, вам нужно сделать что-то вроде этого:

require 'iconv'
doc = Nokogiri::HTML(Iconv.conv('utf-8//IGNORE', 'ISO-8859-1', open(link).read))

Подробнее об этом здесь: http://www.quarkruby.com/2009/9/22/rails-utf-8-and-html-screen- scraping

1
ответ дан 28 November 2019 в 17:37
поделиться

Попробуйте установить параметр кодировки для Nokogiri, например:

require 'open-uri'
require 'nokogiri'
doc = Nokogiri::HTML(open(link))
doc.encoding = 'utf-8'
title = doc.at_css("title")
6
ответ дан 28 November 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: