2016-06-02 3 views
-1
  • Я читаю локальный файл .html, используя следующую строку:Nokogiri выводит разные строки на разных системах

    myDoc = File.open("Ina.html") { |f| Nokogiri::HTML(f) }

  • я получаю узел с помощью XPath, а затем я просто распечатать его

    divNode = myDoc.at_xpath('//div[@id="mw-content-text"]/p[1]') puts divNode

Фрагмент вывода на одной системе: Использование рубин 2,3

<p><b>Ina:</b> Ñe’êpehê , ñe’ẽtéva rire (aha´aína)</p>

Фрагмент вывода на другой системе: Использование рубинового 2,1

<p><b>Ina:</b> &Atilde;&#145;e&acirc;&#128;&#153;&Atilde;&ordf;peh&Atilde;&ordf; , &Atilde;&plusmn;e&acirc;&#128;&#153;&aacute;&ordm;&frac12;t&Atilde;&copy;va rire (aha&Acirc;&acute;a&Atilde;&shy;na)</p> 

Любые мысли о том, что происходит с кодировкой ? Все предложения по форсированию кодирования и/или указанию кодировки не были успешными.

+0

Для справки, вот URL в HTML я работаю с [link] (https://gn.wiktionary.org/wiki/Ina) – Joel

+0

Возможно, это языковая проблема, одна система может поддерживать другую, это не так. –

+0

Хм. это может быть, но когда я печатаю фактические строки напрямую, например, ставит «», проблем нет. Я думаю, что это также может быть связано с тем, как Nokogiiri декодирует html-файл. – Joel

ответ

0

nokogiri иногда бывает странно. Я не мог объяснить, что nokogiri «предполагается» здесь сделать - обе версии являются «правильными», представляя одно и то же в документе HTML. Это точно такая же версия нокогири? Если это так, это может быть другая версия libxml, которую nokogiri использует под капотом, а в некоторых случаях будет использовать существующую установку системы. Или разница в рубине 2.1 против 2,3 может иметь значение, хотя это кажется маловероятным.

В принципе, если вы хотите точно такого же поведения, вам нужно использовать точно такую ​​же версию всего - ruby, nokogiri, libxml.

Первый - это только простые байты в Юникоде, второй - символы не-ascii, замененные объектами символов html. Оба должны быть одинаковыми в браузере. Если вы хотите одно из этих поведений, а не другое (лично я думаю, что я предпочел бы использовать Юникод), это вопрос другого типа, но есть , вероятно, способ заставить nokogiri сделать это. Но я этого не знаю.

Если вы используете Nokogiri :: XML вместо Nokogiri :: HTML, я бы сделал ставку, это не заменит non-ascii объектами символов html, но вы также, если я правильно напомню, прощая не вполне легальное синтаксическое поведение, используемое парсером HTML.

Подождите, теперь, подойдя ближе, я думаю, что, возможно, вторая не представляет то же самое, это html-символьные сущности, но я не уверен, что они действительно правильные. Может ли кодировка перепутаться? В зависимости от того, как вы читаете данные и ОС, и какова переменная env LANG, если она является машиной unix, она может испортить кодировку.

Кроме того, вы уверены, что файл Ina.html, который вы открываете, действительно идентичен на обеих системах? Может ли он стать поврежденным или преобразованным по-разному в процессе загрузки? Скопируйте файл с одного компьютера на другой, чтобы убедиться, что два файла действительно идентичны.

+0

Nokogiri редко делает «странные вещи». Он делает то, что мы ему говорим, поэтому, когда мы говорим, что это странные вещи, мы получаем странный результат. –

0

Ну, я исправил проблему, но я до сих пор не совсем понимаю, почему этот способ не сработает.

Итак, решение состояло в том, чтобы просто прочитать весь .html-файл, а затем создать экземпляр объекта nokogiri, проанализировав строку файла.

file = File.open(outputFolder + "/" + htmlName,"rb") 
    content = file.read 
    doc = Nokogiri::HTML.parse(content,nil, "UTF-8") 

Для меня это было равносильно либо одному из утверждений, которые я пробовал:

  • myDoc = File.open("Ina.html") { |f| Nokogiri::HTML(f) }
  • myDoc = File.open("Ina.html", nil, "UTF-8") { |f| Nokogiri::HTML(f) }
Смежные вопросы