2012-01-06 52 views
1

我使用Nokogiri解析html。我需要页面中的内容和图片标签,因此我使用inner_html而不是content方法。但由content返回的值编码正确,而由inner_html错误编码。有一点需要注意,该页面是中文的,不使用UTF-8编码。由Nokogiri提取的Html错误编码

这里是我的代码:

# 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 
+0

您正在使用什么版本的Ruby的?什么版本的Nokogiri?你的期望是什么?当我在Ruby 1.9下运行上面的代码时,我得到一个以“目前市面上影响比较大的讲述”论文开头的UTF-8编码字符串。 – Phrogz 2012-01-06 18:13:52

+0

@Phrogz我使用Ruby 1.9.2;如果我使用'link.content',那是正确的(如上所述)。但除了纯文本外,我还希望从页面获取html标签,如img。但是这一次,它不是UTF-8编码。它输出类似于'Ŀǰ????????????' – Frankel 2012-01-07 01:03:05

+0

请更新您的问题,显示如何重现和验证问题,以及您的期望或愿望代替。 – Phrogz 2012-01-08 17:33:18

回答

5

这是在 '编码' 一节写自述:http://nokogiri.org/

字符串总是存储为UTF-8内部。返回 文本值的方法将始终返回UTF-8编码的字符串。 返回XML(如to_xml,to_html和inner_html)的方法将返回类似于源文档编码的字符串 。

所以,你应该转换inner_html字符串,如果手动你想获得它作为UTF-8字符串:

puts link.inner_html.encode('utf-8') # for 1.9.x 
+0

它的工作原理非常感谢。 – Frankel 2012-01-10 02:45:20

1

我觉得内容剔除标签很好,但是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 
+1

你可能想澄清这是如何解决这个问题的。 – 2012-01-06 12:09:31

+0

@DaveNewton道歉,请参阅编辑。谢谢 – Hishalv 2012-01-06 12:55:21

+0

@Hishalv谢谢。试过你的代码,输出仍然是错误的编码。我想知道是否需要手动进行一些编码转换。 – Frankel 2012-01-07 01:10:37