如何在Python爬虫中跳过不存在的HTML遍历文件?
问题解答
核心结论
完全可以用try-except实现需求,但得注意精准抓特定异常,别啥错误都跳过,不然出了别的问题你都不知道。另外原代码里还有几个小bug得先改了,不然逻辑跑不起来。
修正后的完整代码
import os from bs4 import BeautifulSoup c = 1 n = 100 # 这里填你要遍历的最大数字 path = "./output" # 填你的根目录路径 while c <= n: path1 = os.path.join(path, f"Chapter {c}") # 先检查目录有没有,别重复创建报错 if not os.path.exists(path1): os.mkdir(path1) # 原代码补零逻辑有问题:比如c=1000的时候,会先触发c>=10的分支,永远到不了c>=1000的情况,改一下顺序 if c < 10: z = f'000{c}' elif c < 100: z = f'00{c}' elif c < 1000: z = f'0{c}' else: z = str(c) print(z) html_file = f"{z}.html" try: # 打开HTML文件的操作放try里,文件不存在直接触发异常 with open(html_file, 'r', encoding='utf-8') as fp: contents = fp.read() soup = BeautifulSoup(contents, 'lxml') title = soup.find('h1') paragraphs = soup.find_all('p') # 只有成功读到HTML内容,才写txt文件 chapter_file = os.path.join(path1, f"chapter{c}.txt") with open(chapter_file, 'w', encoding='utf-8') as f: # 先写标题(如果有的话) if title: f.write(title.get_text(strip=True) + '\n\n') # 再写所有段落内容,跳过空段落 for p in paragraphs: text = p.get_text(strip=True) if text: f.write(text + '\n\n') except FileNotFoundError: print(f"{html_file} 不存在,直接跳过") c += 1 continue # 其他错误单独处理,比如文件读不了、解析出错,别直接跳过 except Exception as e: print(f"处理 {html_file} 时出错了: {str(e)}") c += 1 continue c += 1
关键细节说明
- 别用裸except:专门抓
FileNotFoundError就行,要是用裸的except,像权限不够、HTML解析出错这种问题也会被跳过,到时候排查问题头大。 - 补零逻辑要改:原代码里
elif c>=10会先匹配所有大于等于10的数,比如c=1000的时候也会走这个分支,永远到不了c>=1000的判断,得改成从小到大的区间判断。 - 目录先检查再创建:不然重复运行代码的时候,创建已存在的目录会报错,加个判断就解决了。
- 指定编码:打开文件时加
encoding='utf-8',避免不同系统下乱码。 - 写入逻辑放try里:要是HTML文件不存在,就别创建空的txt文件了,所以把写文件的代码也放try块里,只有成功读了HTML才执行。
关于你提的try-except写法
你的思路是对的,但有几个小问题要改:
- 要把打开HTML、爬取内容、写入文件这些操作全放
try块里,不然只抓一部分没用。 - 语法是
except不是exception,而且最好指定具体的异常类型。 continue后面不用加冒号。
内容的提问来源于stack exchange,提问作者Dofan Lmotawil
相关产品推荐
相关产品推荐

