Неверно закодированный HTML, полученный от Nokogiri - PullRequest
1 голос
/ 06 января 2012

Я использую Nokogiri для разбора HTML. Мне нужны теги содержимого и изображения на странице, поэтому я использую inner_html вместо content метода. Но значение, возвращаемое content, кодируется правильно, а неправильно кодируется inner_html. Одно замечание: страница написана на китайском языке и не использует кодировку UTF-8.

Вот мой код:

# encoding: utf-8
require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'iconv'

doc = Nokogiri::HTML.parse(open("http://www.sfzt.org/advise/view.asp?id=536"), nil, 'gb18030')

doc.css('td.font_info').each do |link|
  # output, correct but not i expect: 目前市面上影响比
  puts link.content

  # output, wrong and not i expect: <img ....></img>Ŀǰ??????Ӱ??Ƚϴ?Ľ????
  # I expect: <img ....></img>目前市面上影响比
  puts link.inner_html
end

Ответы [ 2 ]

5 голосов
/ 10 января 2012

Это написано в разделе «Кодировка» в README: http://nokogiri.org/

Строки всегда хранятся как UTF-8 внутри. Методы, которые возвращают текстовые значения всегда будут возвращать строки в кодировке UTF-8. Методы, которые return XML (например, to_xml, to_html и inner_html) вернет строку закодирован как исходный документ.

Итак, вам нужно преобразовать inner_html строку вручную, если вы хотите получить ее как строку UTF-8:

puts link.inner_html.encode('utf-8') # for 1.9.x
1 голос
/ 06 января 2012

Я думаю, что контент удаляет теги хорошо, однако узлы метода inner_html не делают это очень хорошо или вообще.

"Я думаю, что вы можете получить довольно странные состояния, если во время обхода вы измените inner_html (который содержит теги). Другими словами, если вы обходите дерево узлов, вы не должны делать ничего, что могло бы добавить или удалить узлы. "

Попробуйте это:

doc.css('td.font_info').each do |link|
  puts link.content
  some_stuff = link.inner_html
  link.children = Nokogiri::HTML.fragment(some_stuff, 'utf-8')
end
...