Как сказать Nokogiri при разборе документа, чтобы он не конвертировал его в другую кодировку (в моем случае, не конвертировать & paund; ни во что другое) - PullRequest
2 голосов
/ 20 июля 2010

Как я могу сказать Nokogiri не преобразовывать документ в другую кодировку, в моем случае не преобразовывать &paund; во что-либо еще?

У меня есть файл, содержащий:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<span>&pound;</span>
</body>
</html>

Я анализирую его с помощью Nokogiri:

d = Nokogiri::HTML.parse(open('/tmp/in.html', 'r'))

Если я печатаю документ "d", я получаю:

<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n
<html>\n
<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"></head>\n
<body>\n
<span>\302\243</span>\n
</body>\n
</html>\n

Примечание: &pound; стал "\ 302 \ 243"(или £, который был закодирован в ISO-8859-1, стал кодироваться в UTF-8)

Если я сохраню документ" d "в файл:

open('/tmp/out.html', 'w') do |out|
out << d.to_html
end

Я получуследующее:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head>
<body>
<span>ВЈ</span>
</body>
</html>

После анализа документа с помощью &paund; и сохранения его в файл я получил два символа вместо BJ.

Я думаю, что нетуказав кодировку на каком-то этапе, но я не уверен, где.

1 Ответ

1 голос
/ 30 января 2011

Определение 'разбора' из Nokogiri из документации, ищите кодировку:

# File lib/nokogiri/html.rb, line 22

22:       def parse thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block
23:         Document.parse(thing, url, encoding, options, &block)
24:       end
...