本地有很多php+html代码文件,可是文件名是url(数据库直接导出),怎么把文件名批量修改成html的title呢?这里需要用到两个模块,一个是OS,用于进行文件操作;另一个是BeautifulSoup,用来解析html文件。

当然,这个过程中会有跟多坑,稍微不注意就会掉进坑里。

坑1:

编码
解决方式:文件打开用编码范围最广的gb18030,decode('gb18030','ignore')
这样之后错误少很多了,但还是会报错,从而造成循环终止。为了使得程序继续运行,可以使用以下代码形式来使得循环跳过错误继续进行。

1
2
3
4
5
try:
code1
code2
except(error):
continue

坑2:

路径
很多网站html的title不是很规范,比如36大院的title里还包含很多表情符号,比如* % ^ —— /之类的,windows不支持这些直接作为文件名,所以报错,需要进行替换。如果会正则的话比较容易,如果不会的话……那就repalce吧。以及如果包含/,系统会认为这是一个路径,而不是文件名所以报错,一定要注意这一点。
解决方式:把文件名中的/替换掉

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import re
import sys
from bs4 import BeautifulSoup
files = os.listdir(os.getcwd())#分解文件名为名字+后缀,用来区分需要重命名哪些文件以及修改后缀
for name in files:
a = os.path.splitext(name)
#print (name)
if a[0] =='showmsg':
try:
print(name)
f = open(name,"rb")
htmlf = f.read().decode('gb18030','ignore')#编码
soup = BeautifulSoup(htmlf,"lxml")
#soup = BeautifulSoup(open(name),"lxml",from_encoding="gb18030")
new1= soup.title.string#解析出html文件的title(字符串形式)
#new1= soup.title.encode('gb2312')
new1=new1.replace('/','][')
new1=new1.replace(':','')
new1=new1.replace('【','[')
new1=new1.replace('】',']')
new1=new1.replace('?','')
new1=new1.replace('|','')
new1=new1.replace('*','')
new1=new1.replace('•','')
new1=new1[:-14]
#分类对文件重命名
if '&page=' in name:
num=re.findall(r'page=(\d+)',name)
newname = new1 + num[0] +'.html'#顺便修改文件类型为html
else:
newname = new1 + '.html'
#newname = new1 + name[:] +'.html'
#newname = soup.title.string
print (newname)
f.close()
os.rename(name,newname)
except(FileExistsError,FileNotFoundError,UnicodeEncodeError,OSError):#错误类型
#os.remove(name)#本来想删除来着,但是当出现编码错误的时候,文件删除会提示正在别的地方占用,禁止删除。估计和句柄有关,但不想解决了,太复杂。

重命名之前:
包含两种文件,一种是一个的id只有一页;一种是一个id有很多页,page不同,正则提取page放入文件名后面加以区分
before

重命名之后:
after

ps:
这个是36大院的数据库文件。知道36大院的小伙伴请让我看到你们的双手!!!!!!

文章目录
  1. 1. 坑1:
  2. 2. 坑2: