python3中用httplib2抓取某些站点的转码问题

吃鱼的虾米 发布于 2014/03/05 10:35
阅读 1K+
收藏 1
import httplib2

if __name__ == '__main__':
    url = 'http://word.iciba.com/'
    
    opner = httplib2.Http()
    
    resp,content = opner.request(url, 'GET')
    
    print(content)

以上是测试代码

python2中得到的结果,content是str类型并且能使用正则对内容进行解析

python3中的httplib2返回的是bytes对象,如果要对内容进行解析必须转为字符串类型

采用str转换不行,会得出b'<html>\r\n.....'这样的字符串并且中文全部为\x8e的这样的编码,采用content.decode('utf-8')会直接报告错误,某些编码无法转换

上述代码中抓百度首页使用decode方式又能得到正确的str类型

请问在python3中该如何处理httplib2的返回类型并解析成正确的str


以下是问题补充:

@吃鱼的虾米:python3中urllib返回的内容也是bytes (2014/03/05 10:47)
加载中
0
吃鱼的虾米
吃鱼的虾米

感谢各位,问题已经解决了

这个页面的js部分有一些注释是乱码的导致无法将bytes转化为utf8的字符串

这里贴一下解决代码

import httplib2
import re

if __name__ == '__main__':
    url = 'http://word.iciba.com/'
    
    opner = httplib2.Http()
    
    resp,content = opner.request(url, 'GET')
    
    tmp = content.decode('iso-8859-15')#实验结果iso-8859-15可以正确的解释那些乱码
    p = re.compile('<script[^>]*?>.*?</script>', re.S)
    tmp = p.sub('', tmp)#因为内容匹配中不需要js代码所以去除了所有的script标签,当然其中的乱码注释也跟着去掉了
    tmp = bytes(tmp,'iso-8859-15')#通过iso-8859-15转为bytes类型
    print(tmp.decode('utf-8'))#可以得到正确的utf-8字符串了



吃鱼的虾米
吃鱼的虾米
强迫症,有新的就不想用旧的……
悲催不悲催
悲催不悲催
怪不得,我自己还看了下,原来你是python3的,现在python3和python2.7很多库都不太一样,建议你改用python2.7
0
悲催不悲催
悲催不悲催
建议使用python request库,你所提出的问题已经在request里面解决了。
吃鱼的虾米
吃鱼的虾米
尝试了你提供的request苦,在python3中依然返回bytes,还是同样的问题
0
WAKnow
WAKnow
我有用过的方法是先抓网页中的charset信息,读到编码然后用decode解析,差不多就能解决问题了。
吃鱼的虾米
吃鱼的虾米
decode确认是utf8,不用抓,现在的问题是报错
返回顶部
顶部