上篇中的程序实现了抓取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 locale from bs4 import BeautifulSoup print(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) #category
print("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_time
print("Note:", end='')
print(article.p.find_next_sibling().string) #note
print('-'*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中特有的空字符&nbsp。

要爬取的网页默认的编码方式是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 sys from bs4 import BeautifulSoup 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) #category
print("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_time
print("Note:", end='')
print(article.p.find_next_sibling().string) #note
print('-'*50) fp.close()
sys.stdout = old #恢复系统默认输出
print("Done!")
input() #等待输入,为了不让控制台执行后马上结束。

执行后,无错误产生,成功写入文件。打开文件,显演示样例如以下:

能够看出,输出结果与上一篇命令行输出的结果是一样的。圆满解决,OK!!

另外,今天抽出时间学了下Github。早闻大名,看了下介绍。发现非常强大,跟着官网教程Helloworld入了下门,注冊了个帐号。准备以后代码都放在那上面了。

使用BeautifulSoup爬取“0daydown”站点的信息(2)——字符编码问题解决的更多相关文章

  1. 使用requests、BeautifulSoup、线程池爬取艺龙酒店信息并保存到Excel中

    import requests import time, random, csv from fake_useragent import UserAgent from bs4 import Beauti ...

  2. Python爬虫项目--爬取自如网房源信息

    本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http:/ ...

  3. PYTHON 爬虫笔记九:利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集(实战项目二)

    利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集 目标站点分析 今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方 ...

  4. Python爬取房天下二手房信息

    一.相关知识 BeautifulSoup4使用 python将信息写入csv import csv with open("11.csv","w") as csv ...

  5. Node.js爬虫-爬取慕课网课程信息

    第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...

  6. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...

  7. Selenium+Chrome/phantomJS模拟浏览器爬取淘宝商品信息

    #使用selenium+Carome/phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏 ...

  8. 利用 Scrapy 爬取知乎用户信息

    思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一 ...

  9. 利用Selenium爬取淘宝商品信息

    一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...

随机推荐

  1. Selenium_WebDriver操作iFrame日历框和复选框_Java

    iFrame日历框 页面上遇到iFrame元素时,先用findElement找到这个iFrame元素,然后再WebDriver.switchTo().frame(calFrame).在iFrame里操 ...

  2. J2EE之13个规范标准概念

    主要是关于j2EE十三个规范的总结. java基础知识 首先java分为三类:J2ME.J2SE.J2EE. 依据开发软件的大小和量级他们的作用分别不同,J2ME是开发为机顶盒.移动电话和PDA之类嵌 ...

  3. Image与byte[]数组的相互转换

         近期项目有个需求是关于图片操作的,须要将图片保存到数据库中.经过尝试才知道Image类型文件是不能直接存储到数据库中的.保存之前须要我们做一步转换:将Image转换成字节数组类型Byte ...

  4. jquery11源码 animate() : 运动的方法

    { var fxNow, timerId, rfxtypes = /^(?:toggle|show|hide)$/, rfxnum = new RegExp( "^(?:([+-])=|)( ...

  5. 深入浅出微服务框架dubbo(一):基础篇

    一.基础篇 1.1 开篇说明 dubbo是一个分布式服务框架,致力于提供高性能透明化RPC远程调用方案,提供SOA服务治理解决方案.本文旨在将对dubbo的使用和学习总结起来,深入源码探究原理,以备今 ...

  6. 45. Express 框架 静态文件处理

    转自:http://www.runoob.com/nodejs/nodejs-express-framework.html Express 提供了内置的中间件 express.static 来设置静态 ...

  7. Repeater控件的

    http://blog.csdn.net/zhang_xinxiu/article/details/21872433 想起来,公司的aspx页面前台数据展示除了datagrid以为还有Repeater ...

  8. Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳)

    Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳).pdf下载地址 ,step by step http://download.csdn ...

  9. C# wpf程序获取当前程序版本

    C# wpf程序获取当前程序版本 /// <summary>         /// 获取当前系统的版本         /// </summary>         /// ...

  10. [51Nod]NOIP2018提高组省一冲奖班模测训练(四)翻车记+题解

    链接 下午5点的时候,突然想起来有这个比赛,看看还有一个小时,打算来AK一下,结果因为最近智商越来越低,翻车了,我还是太菜了.上来10分钟先切掉了C和A,结果卡在了B题,唉. A.砍树 一眼题,两遍树 ...