前言
前几天写了一个爬P站的分布式爬虫,然后一如既往的把电脑扔在那里不管.....然后上课回来就杯具了,因为我原来默认的文件地址是爬到我在C:\的用户桌面里面方便管理,然后在爬取了1000+的高分辨壁纸之后,发现C盘满了?
那你很棒棒哟 щ(`ω´щ) (我竟然一直把爬虫放在系统盘??)
然后翻山越岭找设置文件准备重新设置下载路径【对,爬虫不是我写的】
正文
文件路径的表达
由于很久很久没有写了,于是一打开就急忙在D:\新建了一个放老婆们的文件夹,准备迁移老婆
```py
#下载网页文件到本地文件夹
import os,urllib2,urllib
#设置下载后存放的存储路径'D:\python\picture\benzi'
path='D:\python\picture\benzi'
file_name='000XXX.avi' #文件名,包含奇怪的文件格式
dest_dir=os.path.join(path,file_name)
```
然后就炸了
```py
IOError: [Errno 22] invalid mode ('w') or filename: '000XXX.avi'
```
大快人心~
赶紧检查文件路径,发现并没有什么问题...
.
以我多年学习C++写friopen的经验,一定是系统PATH设置有问题!
转义!
使用高级的搜索算法BDFS(英语:Baidu-First-Search,简称BDFS)之后,发现小白病犯得不轻,只需要转义在文件路径前加上r或者用双反(‘\\’)代替反斜杠(‘\’),即可化腐朽为神奇,重现青春活力【逃】
这还要从字符串的原理说起
真正的原理是python会把文件路径中的‘\’认为是一个含有特殊意义的字符(比如占位符,换行符等等),而字符串返回的值,会让python从原本的字面意义上去理解这行文件路径【噗嗤】
不仅仅是python,就连你在这篇文章里面看到的所有双反,其实都是三个斜杠('\\'),而这里的三个斜杠其实在源代码里面又是五个斜杠
怎么样晕没有?
没有就接着听qwq
在大多数高级语言中(如py,md等等)斜杠都不会以ASCII的字符显示出来,而是作为有特殊含义的转义字符
那么问题来了,如果我想print('/n')
?
这时候就需要有像'''之类的东西来划定不需要被转义的范围,在python和markdown中通常是两个反斜杠(\这里的内容不会被转义,而是字面意思\)
那为什么要加r呢?
r后面带的这样的一个字符串 它里面所有的字符在解释的时候 直接都按字面来解释 这个后面是不是正好都是我们要的
这样的一个路径加文件名 使用的是原始字符串 在很多时候的话可以避免出错
而如果不加这个r的话怎么办呢 其实要用到这样的形式 要用两个反斜杠 这是我们后面要讲的转义字符 也就是说在一个字符串里面的话 如果你要表示一个反斜杠 需要用两个反斜杠来表示 这部分内容我们后面会专门讲到 所以在类似于这样的情况下面 我们用r这样的原始字符串操作符 往往会比较地方便 【是吗老贼?】
那到底被转义成了什么呢?
答:Unicode字符串【只需要知道这个编码一直跟ASCII有仇就明白了】
拓展阅读Unicode维基百科
结语
罗里吧嗦有点多了,附上资料参考
还有我几百万年前看别人用python写的网页文件下载器
今天就拉出来造福一下人类吧......【码风不力,码风不力啊~】
```py
# -* - coding: UTF-8 -* -
#!/usr/bin/python
#下载网页所有图片到本地文件夹
import os,urllib2,urllib
import re,urllib2
def getPage(url):
'''''下载文件html代码,找出一楼的核心代码'''
opener = urllib2.build_opener()
#不加头信息则出现403错误和乱码
opener.addheaders = [('User-agent', 'Mozilla/5.0')];
htmlAll = opener.open( url ).read()
reg1Floor = '<div class="msgfont">(.*?)</div>'
html = re.search(reg1Floor,htmlAll)
html = html.group()
#文件保存编码和文件编辑编码都是utf-8,所以decode一次,不然会出现乱码,但是不影响结果。
return html.decode('utf-8')
def getImg(url):
'''''从核心代码中照图图片地址,并且下载保存、命名'''
pageHtml = getPage(url)
#找到所有图片地址
regImg = '<img src="(.*?)" alt="" />'
imglist = re.findall(regImg,pageHtml)
dir = r'E:\img'
#print imglist
for index in xrange(0,len(imglist)):
picname = str(index+1) + '.jpg'
finename = os.path.join(dir,picname)
urllib.urlretrieve(imglist[index], finename)
print finename + ' ok!'
if __name__ == '__main__':
getImg('http://topic.csdn.net/u/20101013/11/024465A6-8E16-444C-9A09-DD374D29044C.html')
```
网友评论