最近在学习python爬虫,所用的书是《Python爬虫开发与项目实践》,作者是,范传辉,在学习第五章的时候,遇到中文乱码的情况,安装书中的代码总是乱码,自己摸索和网络搜索资料解决后,将这记录下来:
代码如下:
# -*- coding: utf-8 -*
from lxml import etree
import requests
import csv
import re
import sys
reload(sys)
sys.setdefaultencoding('utf-8') #自己添加的,设置string的编码方式是utf-8
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent':user_agent}
r = requests.get('http://seputu.com', headers=headers)
r.encoding = 'utf-8' #设置requests的编码方式
#使用lxml解析网页
print r.headers['content-type']
html = etree.HTML(r.text)
div_mulus = html.xpath('.//*[@class="mulu"]') #先找到所有div class = mulu标记
pattern = re.compile(r'\s*\[(.*)\]\s+(.*)')
rows = []
for div_mulu in div_mulus:
div_h2 = html.xpath('.//*[@class="mulu-title"]/center/h2/text()')
if len(div_h2) > 0:
h2_title = div_h2[0]
print h2_title
a_s = div_mulu.xpath('./div[@class="box"]/ul/li/a')
for a in a_s:
#找到href属性
href = a.xpath('./@href')[0].encode('utf-8')
box_title = a.xpath('./@title')[0]
print box_title
pattern = re.compile(r'\s*\[(.*)\]\s+(.*)')
match = pattern.search(box_title)
if match != None:
date = match.group(1)
real_title = match.group(2)
content = (h2_title, real_title, href, date)
print content
rows.append(content)
#以下代码是将获取的信息,保存到csv文件中
headers = ['title', 'real_title', 'href', 'date']
with open('qiye.csv', 'w') as f:
f_csv = csv.writer(f)
f_csv.writerow(headers)
f_csv.writerows(rows)
可以看到目标网页的编码方式是utf-8
如果不指定r.encoding,获取到的文本会出现中文乱码。
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。
请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它:
r = requests.get('http://seputu.com', headers=headers)
r.encoding = 'utf-8' #设置requests的编码方式
如果你改变了编码,每当你访问 r.text ,Request 都将会使用 r.encoding 的新值。你可能希望在使用特殊逻辑计算出文本的编码的情况下来修改编码。比如 HTTP 和 XML 自身可以指定编码。这样的话,你应该使用 r.content 来找到编码,然后设置 r.encoding 为相应的编码。这样就能使用正确的编码解析 r.text 了。
参考:https://blog.youkuaiyun.com/a491057947/article/details/47292923
Python的Requests入门教程:
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html