近来接到一个小项目,读取目标文件中每一行url,并逐个请求url,拿到想要的数据。html
#-*- coding:utf-8 -*- class IpUrlManager(object): def __init__(self): self.newipurls = set() #self.oldipurls = set() def Is_has_ipurl(self): return len(self.newipurls)!=0 def get_ipurl(self): if len(self.newipurls)!=0: new_ipurl = self.newipurls.pop() #self.oldipurls.add(new_ipurl) return new_ipurl else: return None def download_ipurl(self,destpath): try: f = open(destpath,'r') iter_f = iter(f) lines = 0 for ipurl in iter_f: lines = lines + 1 self.newipurls.add((ipurl.rstrip('\r\n')) #log记录读取了多少行IP url #print lines finally: if f: f.close()
咋一眼看code写的没问题,每个url 增长进newipurls set集合中。可是请求的过程当中,requests.get后,会出现以下错误:python
raise InvalidSchema("No connection adapters were found for '%s'" % url)web
后来发现每次都是第一行的url请求失败。而后打印print 请求的url。也没发现异常。而后从根源上去找,好吧,print打印newipurls set集合看看。编码
果真,问题就在这里。url
奇怪,为何这个URL前面为默认加上了\xef\xbb\xbf 这几个字符呢?spa
上网看了一些资料,原来在python的file对象的readline以及readlines程序中,针对一些UTF-8编码的文件,开头会加入BOM来代表编码方式。3d
所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,一般出如今文本的开头,用来标识字节序(Big/Little Endian),除此之外还能够标识编码(UTF-8/16/32)。code
其实若是你们有UltraEdit tool能够发现,在另存为文件的时候,能够保存为UTF-8 和UTF-8 无BOM的文件。htm
若是将文件另存在UTF-8的格式,则文件的开头默认会增长三个字节\xef\xbb\xbf。对象
import codecs def download_ipurl(self,destpath): try: f = open(destpath,'r') iter_f = iter(f) lines = 0 for ipurl in iter_f: lines = lines + 1 if ipurl[0:3] == codecs.BOM_UTF8: self.newipurls.add((ipurl.rstrip('\r\n')).lstrip('\xef\xbb\xbf')) #print self.newipurls #log记录读取了多少行IP url #print lines finally: if f: f.close()
引用codecs模块,来判断前三个字节是否为BOM_UTF8。若是是,则剔除\xef\xbb\xbf字节。
其实你们能够经过其余方式剔除BOM字节,我写的比较粗糙。