使用BeautifulSoup爬取“0daydown”网站的信息(2)——字符编码问题解决
上篇中的程序实现了抓取0daydown最新的10页信息,输出是直接输出到控制台里面。再次改进代码时我准备把它们写入到一个TXT文档中。这是问题就出来了。
最初我的代码如下:
#-*- coding: utf-8 -*-
#-------------------------------------
#version: 0.1
#note:实现了查找0daydown最新发布的10页资源。
#-------------------------------------
#-------------------------------------
#version: 0.2
#note:在v0.1基础上输出内容到一个指定TXT文件中
#-------------------------------------import urllib.request
import sys
import localefrom bs4 import BeautifulSoupprint(locale.getdefaultlocale())old = sys.stdout #保存系统默认输出
fp = open("test1.txt",'w')
#fp = open("test1.txt",'w', encoding="utf-8") #以utf-8进行文件编码
sys.stdout = fp #输出重定向到一个文件中for i in range(1,11):url = "http://www.0daydown.com/page/" + str(i) #每一页的Url只需在后面加上整数就行page = urllib.request.urlopen(url)soup_packtpage = BeautifulSoup(page)page.close()num = " The Page of: " + str(i) #标注当前资源属于第几页print(num)print("#"*40)for article in soup_packtpage.find_all('article', class_="excerpt"): #使用find_all查找出当前页面发布的所有最新资源print("Category:".ljust(20), end=''), print(article.header.a.next) #categoryprint("Title:".ljust(20), end=''), print(article.h2.string) #title print("Pulished_time:".ljust(19), end=''), print(article.p.find('i', class_="icon-time icon12").next) #published_timeprint("Note:", end='')print(article.p.find_next_sibling().string) #noteprint('-'*50)fp.close()
sys.stdout = old #恢复系统默认输出
print("Done!")
input() #等待输入,为了不让控制台运行后立即结束。
运行文件后报错:错误信息如下:
Traceback (most recent call last):File "E:\codefile\Soup\0daydown - 0.2.py", line 37, in <module>print(article.p.find_next_sibling().string) #note
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 117: illegal multibyte sequence
从文中可以看出是Unicode编码错误,说gbk不能编码\xa0这个字节。就字符编码这个问题我看了好多文章,查阅了好多资料。新手没办法,不过还好弄懂了。
最初的时候我根本毫无头绪,查看网上的一些文章开始模仿进行encode.decode的,根本没有用,输出仍然有问题,不抛出异常了,但是根本看不到汉字了,全是一些\x..这种替代了。
问题要追根朔源,我连基本的字符编码和字符集这些东西都没有搞清楚,怎么能解决问题呢?于是我搜索这方面相关文章,给出我觉得好的文章的链接如下:
字符编码详解 这篇文章虽然长,但是作者总结的太详细了,看了后收获很大。
于是我想为什么写入到文件中就会报错呢?而命令行输出就没有这个问题。难道文件有问题?文件的编码有问题?我顺着这个问题找到了一篇讲Python3的文件的文章,很好,链接如下:
Python3的文件 其中里面写到了文件的编码,原来打开文件时是可以指定文件编码的,如果不指定,那么文件默认采用什么编码方式呢?这篇文章做出了详细的解释。
我的源代码中打开文件的方式是:fp = open("test1.txt",'w'),结果抛出异常,从上面抛出的异常可以说明默认打开文件,文件的编码方式是gbk,而GBK是不能编码\xa0这个字符的,查了下这个字符,原来是HTML中特有的空字符 。要爬取的网页默认的编码方式是utf-8,说明utf-8是能编码这个字符的。那么我们可以指定文件的编码方式不呢?答案是可以,原来open中还有个参数是encoding,用来指定编码方式,如果我们指定它为utf-8会怎样?下面是正确的代码,不同的只是把fp = open("test1.txt",'w')变为了fp = open("test1.txt",'w', encoding="utf-8")。代码如下:
#-*- coding: utf-8 -*-
#-------------------------------------
#version: 0.1
#note:实现了查找0daydown最新发布的10页资源。
#-------------------------------------
#-------------------------------------
#version: 0.2
#note:在v0.1基础上输出内容到一个指定TXT文件中
#-------------------------------------import urllib.request
import sysfrom bs4 import BeautifulSoupold = sys.stdout #保存系统默认输出
#fp = open("test1.txt",'w')
fp = open("test1.txt",'w', encoding="utf-8") #以utf-8进行文件编码
sys.stdout = fp #输出重定向到一个文件中for i in range(1,11):url = "http://www.0daydown.com/page/" + str(i) #每一页的Url只需在后面加上整数就行page = urllib.request.urlopen(url)soup_packtpage = BeautifulSoup(page)page.close()num = " The Page of: " + str(i) #标注当前资源属于第几页print(num)print("#"*40)for article in soup_packtpage.find_all('article', class_="excerpt"): #使用find_all查找出当前页面发布的所有最新资源print("Category:".ljust(20), end=''), print(article.header.a.next) #categoryprint("Title:".ljust(20), end=''), print(article.h2.string) #title print("Pulished_time:".ljust(19), end=''), print(article.p.find('i', class_="icon-time icon12").next) #published_timeprint("Note:", end='')print(article.p.find_next_sibling().string) #noteprint('-'*50)fp.close()
sys.stdout = old #恢复系统默认输出
print("Done!")
input() #等待输入,为了不让控制台运行后立即结束。
运行后,无错误产生,成功写入文件,打开文件,显示如下:
可以看出,输出结果与上一篇命令行输出的结果是一样的。圆满解决,OK!!另外,今天抽空学了下Github,早闻大名,看了下介绍,发现很强大,跟着官网教程Helloworld入了下门,注册了个帐号,准备以后代码都放在那上面了。
使用BeautifulSoup爬取“0daydown”网站的信息(2)——字符编码问题解决相关推荐
- python BeautifulSoup爬取豆瓣电影top250信息并写入Excel表格
豆瓣是一个社区网站,创立于2005年3月6日.该网站以书影音起家,提供关于书籍,电影,音乐等作品信息,其描述和评论都是由用户提供的,是Web2.0网站中具有特色的一个网站. 豆瓣电影top250网址: ...
- 爬取起点网站图书信息(书名、作者、简介、图片url)
# 爬取qidian网站图书信息(书名.作者.简介.图片url) import requests from lxml import etree import jsonclass BookSpider( ...
- Scrapy :爬取培训网站讲师信息
Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...
- python+requests+beautifulsoup爬取大众点评评论信息
特别声明,此文写于2018年2月,大众点评的页面逻辑,已做了改动,请找最近爬的文章看下,谢谢支持. 先简单聊两句,距离上一篇博客大概过去了4个月,在忙一些别的事情,除了公司有新项目上线,学习新技术之外 ...
- 爬虫项目 | 爬取XX网站招聘信息
/***本人代码小白 ,第一次做爬虫,代码仅供参考,欢迎大神指点,***/ 项目背景和功能 毕业将近,身为大三的我们,面临找工作的压力,如何快速的找到自己心仪的岗位并且及时投递简历成为同学们关心的问题 ...
- BeautifulSoup爬取虎扑步行街信息到Mysql
人生苦短,我用python 今天给大家爬取虎扑步行街的详细信息 效果图如下: 首先根据虎扑步行街链接获取前十个页面链接 for i in range(1, 10):link = "https ...
- python 爬取12306网站车次信息
12306网站爬取车次信息 本想着可以做一个类似于查询详细车次信息的小工具,但是不尽人意,12306网站爬取的车次信息加密了,研究了一个下午也没有研究出其中全部的信息解密: 爬取的信息如下(举一个例子 ...
- 爬取1688网站商家信息
# coding:utf-8 import requests import bs4 import time import xlwt import random def get_IP(): &q ...
- python电影系统管理-Python 爬取电影网站的信息【如有重复请管理删帖】
[Python] 纯文本查看 复制代码#!/usr/bin/env python # -*- coding: utf-8 -*- # [url=home.php?mod=space&uid=6 ...
- python爬考研_python爬取考研网的信息
今天我们使用python来爬取考研网站的信息. 目标网站: https://yz.chsi.com.cn/zsml/queryAction.do 使用的库: requests,bs4,pandas 这 ...
最新文章
- 为什么有时优盘是只读模式_为什么安装了Paragon NTFS磁盘还是只读,不能进行操作?...
- 你那么追捧的springboot,到底替你做了什么?
- keras-vis可视化特征
- 企业做SEO优化哪些行为会被判定为作弊?
- Vue.js——简单计数器
- 如何在网页读取用户IP,操作系统版本等数据demo
- 【Kibana】Kibana下Dev Tools操作ES命令持续积累
- oracle unused 语法_Oracle教程之设置为unused 后如何恢复 ?
- java离线_java8离线版软件下载
- mysql查出每个类型时间最早的记录
- .NetCore对接各大财务软件凭证API——金蝶系列(2)
- Linux文件打包与压缩
- 【FBI WARNING】DP 从看透到看开
- iOS-App移交(更换app开发者账号)
- 夏天我都冷到瑟瑟发抖-用单片机diy懒人挂脖风扇方案
- python应聘项目经历怎么写_简历中怎么写「项目经历」最好?为什么?
- ENVI基于Landsat影像构建郑州市2000-2019年遥感生态指数RSEI
- Building Maintainable Software-java篇之Couple Architecture Components Loosely
- Linux下IO监控与分析 --转载
- 为什么我要反对北大青鸟[转自老赵]
热门文章
- Tomcat各版本说明
- SQL Server 创建数据库关系图时 索引超过数组界限。(已解决)
- oracle防止绿盟扫描,Oracle认证:Oracle避免全表扫描方式
- Dais-CMX系列现代计算机组成原理,dais版本计算机组成原理实验指导.doc
- 电脑如何录制正在播放的视频 这个方法太简单了
- 【九天教您南方cass 9.1】01 安装Cad和Cass9.1
- PPT转pdf保存动画效果
- 【十次方】Springboot中使用Redis做缓存
- Abaqus2019+VS2019+Fortran子程序安装关联全过程亲测有效
- android 开机动画,修改安卓开机动画(除了部分系统 如MIUI等)