初学python学习的内容的记录

今天老师说要把自己学习的内容在微博中分享,觉得非常有道理。今天学习python,运用爬虫技术在网上进行信息检索,才发现字符串编码和解码的问题非常头疼。现在自己查了一些资料并且做了一些总结希望大神指点。

首先强调字符串编码和解码知识是每一个开发人员都应该无条件掌握的知识。

1、基础知识:

编码,简单来讲就是将自然语言转化成计算机语言;解码,就是相反

字符集:所有抽象字符的集合

字符编码:字符集与数学系统的对应关系

2、常用字符集和编码(包括ASCII . GB2312 . BIG5 . UNICODE等等):

2.1 常用字符集和编码

ASCII 主要用于显示现代英语开始是7位表示一个字符,后来扩展到8位表示一个字符。为什么是7位和8位,因为计算机的基本单位是Byte,一个Byte是8位

2.2 GBxxxxx字符集

主要原理是将>127后的字符取消,2字节个连连在一起表示汉子,

2.3 BIG5

繁体字,接触的少先不看,以后用到了再说

3、字符集的统一Unicode

各地都有各自的Unicode为了解决这个问题,Unicode诞生了。Unicode中有UTF-32/UTF-16/UTF-8

重点了解utf-8,有以下特性:

1、128个ASCII码只需要一个字节

2、带符号的拉丁文,等欧洲字符,用2个字节表示

3、其他各种,用三个字节表示

4、极少用的字符用4个字符表示

4、HTTP中字符和字符集相关的消息头

 Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language

accept表示接受的意思,content表示响应的意思

下面一段代码可以解释我今天遇到的问题姐解决方法:

1、错误代码实例,在这个代码中我遇到了字符问题,保存到文件中的代码是乱码:

import urllib2
from lxml import etree


page=open('tieba.txt','w')
request=urllib2.Request('http://tieba.baidu.com/f?ie=utf-8&kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&fr=search')
response=urllib2.urlopen(request)
rehtml=response.read()
html=etree.HTML(rehtml)
result=html.xpath('//li//@data-field')
print 'writing now!!!'
for i in range(1,len(result)):
page.write(result[i].encode('utf-8') )
page.close()
                                                       #这段代码遇到了字符问题无法解决

2、改善后的代码

#coding=utf-8
import urllib2
from lxml import etree
import json
import chardet


page=open('tieba.json','w')
request=urllib2.Request('http://tieba.baidu.com/f?ie=utf-8&kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&fr=search')
response=urllib2.urlopen(request)
rehtml=response.read()
html=etree.HTML(rehtml)
result=html.xpath('//li[@data-field]/@data-field')
for i in range(1,3):
current = result[i]
#(1)str 转化成字符串
# 2)查看它的编码格式
print chardet.detect(str(result[i]))#得到结果{'confidence': 1.0, 'encoding': 'ascii'}
#因为有中文,而且原网站charset为utf-8
item = json.loads(current,encoding='utf-8')
#print item
#dict转成字符串
outitem = json.dumps(item,ensure_ascii=False)
#print outitem
#查看outitem类型
#print type(outitem)
#将unicode转化为输出格式Utf-8
page.write(outitem.encode('utf-8')+'\n')


page.close()







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值