用python抓取的网页保存后为啥乱码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用python抓取的网页保存后为啥乱码?相关的知识,希望对你有一定的参考价值。

已知要保存的网页用chardet测出为gb2312,直接用浏览器保存网页一切正常,但当用python中urllib.urlretrieve()来保存后,发现网页乱码,这是什么原因?
另,
content = urllib.urlopen(req).read()
html = unicode(content,'gb2312')这句的unicode()是什么意思?

参考技术A

从你给的代码来是Python2。我下面给一个基于Python3的代码,可以参考一下:

rom urllib.request import urlopen;  
from urllib.parse import quote;  
rawtext=urlopen('http://www.ccnu.edu.cn',timeout=15).read();
print(rawtext)
rawtext=rawtext.decode('gbk')
print(rawtext)  
f=open('ccnu.txt','w',encoding='utf8');
f.write(rawtext)

大概的原理是,在Python3下面,抓取到的页面默认是byte类型的(通过第4行输出的结果就可以看出来),我们需要根据网页的实际编码进行处理。本例中给的网页使用的是gb2312。所以,我要先以gbk的格式进行解码(gbk包含了gb2312,能够表示更多的汉语字符),解码后实际上得到的就是unicode码了,由于我的控制台编码设置的是utf8,在打印时系统会自动将字符串从unicode转为utf8,所以第6行控制台打印结果正常;第7行写入文件时也要指定文件的编码格式,我这里选择的是utf8,当然用gbk也是一切正常的,因为这个编码设置的是保存文件的编码,而不是原来那个网页内容的编码了。字符串编码和文件编码不是一回事。打开ccnu.txt发现无乱码。

Python2的代码我不熟。

建议你也在代码中添加print 看控制输出是否正常。如果控制台输出正常,则有可能是在保存页面文件时,没有正确指定内容字符串的encode格式。或者把所有gb2312换为gbk再试试。

反正Python2下面极容易出现汉字乱码,如果能理解编码encode和解码decode的含义,了解Python2的字符串处理过程,就可以避免这些问题。

本回答被提问者和网友采纳
参考技术B 读取的时候赋值到一个变量,可以在调试状态看一下是什么类型的,然后直接写到本地文件。或者在写的时候加encode来转换。 参考技术C 应该是DOCtype问题吧。 参考技术D 把内容用gb2312解码转成unicode类型。 第5个回答  2015-06-10 你不认识就说是乱码~~ 讨厌。

python怎么抓取网页中DIV的文字

第一张图是我抓取整个网页的代码,怎么修改把所有title的文字抓取出来?

1、编写爬虫思路:
确定下载目标,找到网页,找到网页中需要的内容。对数据进行处理。保存数据。
2、知识点说明:
1)确定网络中需要的信息,打开网页后使用F12打开开发者模式。
在Network中可以看到很多信息,我们在页面上看到的文字信息都保存在一个html文件中。点击文件后可以看到response,文字信息都包含在response中。
对于需要输入的信息,可以使用ctrl+f,进行搜索。查看信息前后包含哪些特定字段。
对于超链接的提取,可以使用最左边的箭头点击超链接,这时Elements会打开有该条超链接的信息,从中判断需要提取的信息。从下载小说来看,在目录页提取出小说的链接和章节名。
2)注意编码格式
输入字符集一定要设置成utf-8。页面大多为GBK字符集。不设置会乱码。
参考技术A

使用 BeautifulSoup  进行解析 html,需要安装 BeautifulSoup

#coding=utf-8

import urllib2
import socket
import httplib
from bs4 import BeautifulSoup

UserAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'

def downloadPage(url):

  try:
    
    opener = urllib2.build_opener()
    
    headers =  'User-Agent': UserAgent 
    
    req = urllib2.Request(url = url, headers = headers)
    
    resp = opener.open(req, timeout = 30)
    result = resp.read()

    return result
      
  except urllib2.HTTPError, ex:
    print ex
    return ''
  except urllib2.URLError, ex:
    print ex
    return ''
  except socket.error, ex:
    print ex
    return ''
  except httplib.BadStatusLine, ex:
    print ex
    return ''


if __name__ == '__main__':

content = downloadPage("这填douban的地址")

#print content

soap = BeautifulSoup(content, 'lxml')

lst = soap.select('ol.grid_view li')

for item in lst:
    # 电影详情页链接
    print item.select('div.item > div.pic a')[0].attrs['href']

    # 图片链接
    print item.select('div.item > div.pic a img')[0].attrs['src']

    # 标题
    print item.select('div.item > div.info > div.hd > a > span.title')[0].get_text()

    # 评分
    print item.select('div.item > div.info > div.bd > div.star > span.rating_num')[0].get_text()
    print '-------------------------------------------------------------------------'

本回答被提问者和网友采纳
参考技术B 最简单的还是用DW,贴到里面,然后就能做了,也不是很难追问

我现在学的又不是DW,你和我说DW干啥?

以上是关于用python抓取的网页保存后为啥乱码?的主要内容,如果未能解决你的问题,请参考以下文章

Python 抓取网页gb2312乱码问题

如何解决用 Beautiful Soup 抓取网页却得到乱码的问题

网页编码格式为UTF-8,文件保存格式也是UTF-8,为啥我用浏览器浏览时是乱码?刷新一下就显示正常!

java爬虫一段话里的部分字符乱码解决

为啥Python写的爬虫有时候抓取的数据是乱码

获取网页乱码