为了账号安全,请及时绑定邮箱和手机立即绑定

ruby 1.9:UTF-8中的无效字节序列

ruby 1.9:UTF-8中的无效字节序列

扬帆大鱼 2019-10-05 15:32:20
我正在用Ruby(1.9)编写一个爬虫,该爬虫使用了来自许多随机站点的大量HTML。尝试提取链接时,我决定只使用.scan(/href="(.*?)"/i)nokogiri / hpricot(主要是提高速度)。问题是我现在收到很多“ invalid byte sequence in UTF-8”错误。据我了解,该net/http库没有任何特定于编码的选项,并且进来的东西基本上没有正确标记。实际使用该传入数据的最佳方法是什么?我尝试.encode设置了replace和invalid选项,但到目前为止没有成功...
查看完整描述

4 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

我建议您使用HTML解析器。只要找到最快的一个。


解析HTML并不像看起来那样容易。


浏览器会在UTF-8 HTML文档中解析无效的UTF-8序列,只需将“ ...”符号放入即可。因此,一旦解析了HTML中的无效UTF-8序列,生成的文本便是有效字符串。


即使在属性值内部,您也必须解码amp等HTML实体


这是一个很好的问题,总结了为什么不能可靠地使用正则表达式解析HTML: RegEx匹配除XHTML自包含标签之外的其他打开标签


查看完整回答
反对 回复 2019-10-05
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

attachment = file.read


begin

   # Try it as UTF-8 directly

   cleaned = attachment.dup.force_encoding('UTF-8')

   unless cleaned.valid_encoding?

     # Some of it might be old Windows code page

     cleaned = attachment.encode( 'UTF-8', 'Windows-1252' )

   end

   attachment = cleaned

 rescue EncodingError

   # Force it to UTF-8, throwing out invalid bits

   attachment = attachment.force_encoding("ISO-8859-1").encode("utf-8", replace: nil)

 end


查看完整回答
反对 回复 2019-10-05
  • 4 回答
  • 0 关注
  • 650 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信