我想更改"http-equiv"内容类型标记中的字符集。因为我在代码的其他部分使用Nokogiri,所以我也想在这个处理步骤中使用它。
这是示例代码:
http_equiv = doc.at('meta[@http-equiv]')
if !http_equiv.nil? && !http_equiv["http-equiv"].nil? && http_equiv["http-equiv"].downcase.eql?("content-type")
http_equiv["content"] = "text/html; charset=utf-8"
end
content = doc.to_html.encode(Encoding::UTF_8)
问题是输入内容和输出内容总是相同的。野村什么也没做。
根据一个答案,我创建了一个真实世界的例子,与生成的例子相比,这个例子不起作用。
require 'nokogiri'
require 'open-uri'
doc = require 'open-uri'
doc = Nokogiri::HTML(open("http://www.spiegel.de/politik/deutschland/hooligans-gegen-salafisten-demo-in-koeln-eskaliert-a-999401.html"))
content_type = doc.at('meta[@http-equiv="Content-Type"]')
content_type['content'] = 'text/html; charset=UTF-8'
puts doc.to_html
我会这样做:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<head>
<meta http-equiv="content-type" content="text/html">
</head>
<body>
foo
</body>
</html>
EOT
content_type = doc.at('meta[@http-equiv="content-type"]')
content_type['content'] = 'text/html; charset=UTF-8'
puts doc.to_html
运行输出:
<!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=US-ASCII">
</head>
<body>
foo
</body>
</html>
你也可以做
content_type['content'] << '; charset=UTF-8'
如果只是附加到现有值。
它不会更改内容类型。
它会更改标记中的内容类型,但它还有更多内容,因为您似乎不想更改内容类型标记,而是想在输出时更改文档本身的编码。一旦你这样做,Nokogiri也会更改元标签以匹配:
doc.to_html(encoding: 'UTF-8')
将告诉Nokogiri输出HTML,尝试从ISO-8859-1转换为UTF-8。但是,由于存在一些不兼容性,因此无法保证这种情况会正确发生。
您最初尝试使用:
content = doc.to_html.encode(Encoding::UTF_8)
无法正常工作,因为HTML编码发生在特殊字符上。在对字符进行HTML编码之前,您必须更改字符编码,如果您使用to_html(encoding: 'UTF-8')
,就会发生这种情况。