python2.7 - python 中文编码问题如何解决?

 sl51866 发布于 2022-10-28 21:56

小弟刚接触python,每次处理中文时都需要百度google大半天,一头雾水。
下面是一小段爬虫:

# -*- encoding:"utf-8"-*-

import urllib2
import sys
from bs4 import BeautifulSoup

reload(sys)
sys.setdefaultencoding('utf8')


headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
req=urllib2.Request(url='http://bj.58.com/',headers=headers)
page = urllib2.urlopen(req)
html=page.read().decode('utf-8').encode('gbk')
soup = BeautifulSoup(html)
title = soup.find_all('h2')
# links = soup.find_all('a')

print title[10].get_text()

出现报错:
UnicodeEncodeError: 'gbk' codec can't encode character u'xbb' in position 13167: illegal multibyte sequence

小弟不是很明白遇到中文时,需要如何处理才能尽量不报错,是要写一大段代码判断还是一两行就能解决问题,比如:
reload(sys)
sys.setdefaultencoding('utf8')
这两行,我看有网友说是个好方法,但我感觉不是很有用。不知道是不是方法不对。

请各位大神不吝指教,小弟虚心学习

5 个回答
  • 换python3

    2022-11-12 01:45 回答
  • 哦 大兄弟 python最蛋疼的就是编码 懒得学 遇到就google好了

    2022-11-12 01:45 回答
  • python2的编码更有迷惑性一些,不知道你是不是用的python2,建议读些编码相关的文章,帮助你理解报错的意思。
    encode是将字符编码为计算机能懂的二进制数据,本质是将一个数转变为另外一个数,比如汉子“学”在gbk字符集里面的数字是a,通过gbk encode为一个二进制数b,同时“学”在unicode字符集里面也有个数字c,通过utf8编码为一个二进制数d,但是a和c的取值范围是不一样的,也就导致某些字符不能被gbk编码,因为不在他的取值范围里面。这就是你题目里报错的意思。
    具体哪里出错还要你把报错的信息贴完整然后判断。
    但作为习惯,使用之前一定要明白源的编码,这样无论是直接用还是想解码后再编码就都有理有据了。

    2022-11-12 01:45 回答
  • import requests
    from pyquery import PyQuery as Q
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    r = requests.get(url='http://bj.58.com/', headers=headers)
    
    print Q(r.text).find('h2').text()
    
    2022-11-12 01:45 回答
  • 1、建议用requests来爬网页
    2、检查内容的encoding
    3、尽量把内容输出到文本文件中查看,而不是控制台(控制台显示中文容易出错)
    4、输出到文本文件前检查是否需要encode('utf-8')

    import codecs, requests
    r = requests.get(url)
    
    print r.encoding  # 如果输出是iso-8859-1, 应手动把encoding改为GBK或utf-8
    # r.encoding = 'gbk'  
    
    my_text = r.content # 或者是r.text
    my_text = my_text.encode('utf-8')  
    
    with open('xxx.txt','wb') as f:
        f.write(my_text)
        
    with codecs.open('xxx.txt','r','utf-8') as f2:
        s = f2.readlines() # 或者是 f2.read()

    20160801修改:针对你给的url,我写了一个修改过的代码在下面

    r = requests.get(url)
    print r.encoding
    r.encoding = 'utf-8' # 查看你的网页源码,里面charset会提到编码格式是utf-8
    
    my_text = r.text # 经试验在你的url下text可以保存,content不行
    with codecs.open('xxx.txt','w','utf-8') as f:
        f.write(my_text)
    
    2022-11-12 01:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有