在学习python爬虫过程中,遇到python2.x中使用requests时中文乱码的问题解决

最近在学习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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值