初学python学习的内容的记录
2016-06-27 14:39
441 查看
今天老师说要把自己学习的内容在微博中分享,觉得非常有道理。今天学习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()
首先强调字符串编码和解码知识是每一个开发人员都应该无条件掌握的知识。
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()
相关文章推荐
- Python MYSQLdb操作数据库
- python写入已存在的excel数据
- spark机器学习笔记:(一)Spark Python初探
- Python yield 使用浅析
- Python爬上不得姐 并将段子写入数据库
- Python opencv(2) 随机产生像素点
- python学习之(一)python crontab的使用
- python 多线程和多进程的区别 mutiprocessing theading
- ubuntu 10.0.4 安装PYTHON 2.7
- python学习
- python函数
- python高级编程
- gensim实现python对word2vec的训练和计算
- python 参数的组合
- python 模块概述
- python 函数的参数
- Python(3)
- python环境搭建
- Mini-project #4 - Pong
- python迭代器itertools