python中遇到的编码问题

文章总述

主要是总结平时在使用python过程中遇到的编码问题

  • 1-写入文件时报UnicodeEncodeError
  • 2-在scrapy框架中用xpath解析时print打印出来是Selector对象
  • 3.\x开头编码的数据解码成中文

1 写入文件时报UnicodeEncodeError

1.1 问题描述

UTF-8编码的字符串,不能写入文件中,当向一个文件写入时,可能会遇到以下问题:
Traceback (most recent call last): File “.py“, line , in f.write(…) UnicodeEncodeError:’ascii’ codec can’t encode characters in position <…>: ordinal not in range(…)

1.2 解决方法一

1.文件声明为 #coding=utf-8
2.开头重新载入编码,代码如下:

1
2
3
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

3.加入写入文件代码

1
file=open('<your filename>','w') #<your filename>是你想要写入的文件名字.

1.3 解决方法二

1.导入模块codecs: import codecs,codecs专门用作编码转换.codecs官方文档
2.以utf8编码打开文件

1
2
3
4
5
6
import codecs
...
#写入文件函数
def save_to_file(list, filename):
with codecs.open(filename, 'a', encoding='utf-8') as f:
f.writelines(list)

1.4 原理


2 在scrapy框架中用xpath解析时print打印出来是Selector对象

2.1 问题描述

在scrapy框架中用xpath解析时print打印出来是Selector对象,代码如下:

1
2
3
4
5
6
7
8
9
10
11
def parse(self,response):
# xpath解析
teacher_list = response.xpath('//div[@class="li_txt"]')
for teacher in teacher_list:
# xpath返回的都是列表
name = teacher.xpath('./h3/text()')
title = teacher.xpath('./h4/text()')
info = teacher.xpath('./p/text()')
print name[0]
print title[0]
print info[0]
  • 打印的结果如下: 图片

2.2 解决方法

  • 将xpath解析后获得的列表或列表中的元素运用extract()方法(),修改后的代码如下:
1
2
3
4
5
6
7
8
9
# 对xpath解析后的列表运用extract()方法
name = teacher.xpath('./h3/text()').extract()
title = teacher.xpath('./h4/text()').extract()
info = teacher.xpath('./p/text()').extract()
# 或者是下面这种
# 对列表中的元素运用extract()方法
print name[0].extract()
print title[0].extract()
print info[0].extract()

2.3 原理


3 \x开头编码的数据解码成中文

3.1 问题描述

在python中输出的中文是以\x开头编码的

1
2
3
4
5
>>> "\xE5\x85\x84\xE5\xBC\x9F\xE9\x9A\xBE\xE5\xBD\x93 \xE6\x9D\x9C\xE6\xAD\x8C".decode('utf-8')
u'\u5144\u5f1f\u96be\u5f53 \u675c\u6b4c'
>>> print "\xE5\x85\x84\xE5\xBC\x9F\xE9\x9A\xBE\xE5\xBD\x93 \xE6\x9D\x9C\xE6\xAD\x8C".decode('utf-8')
兄弟难当 杜歌
>>>

3.2 解决方法

  • \x对应的是UTF-8编码的数据,通过decode(‘utf-8’)转化规则可以转换为Unicode编码,unicode再用print打印出来即可
  • 如果是列表,不要直接打印列表,而应print列表中的元素

4 python编码问题

0%