Python读取txt链接搜网页关键词存TXT时报No scheme supplied错误
报错原因
你看到的No scheme supplied报错核心触发点是传参错误:
- 循环遍历文件对象
list_of_pages时,你取到的单个链接存放在page_link变量里,但调用requests.get()时传入的是整个文件对象list_of_pages,而非单个链接。requests会尝试把传入的文件对象转成字符串当URL解析,自然识别不到http/https协议头,就抛出了这个报错。
除此之外你的代码还存在其他会导致运行异常的问题:
- 读取文件行时没有去除首尾的换行符、空白字符,拼接后的URL会带多余字符导致请求失败
- 逻辑中出现未定义的
url变量和无意义的POST请求,和你要实现的需求完全无关 - 匹配到关键词时写入的是请求响应对象的字符串,而非原始链接;未匹配到关键词时
response变量未定义,会触发NameError - 打开文件时未显式指定编码,默认用系统cp1250编码读取可能出现乱码,且没有手动关闭文件的逻辑,容易出现资源泄漏
- 请求网页时没有设置超时、异常捕获,碰到链接失效、反爬拦截时会直接中断程序
修复后可直接运行的代码
import requests # 要搜索的关键词 TARGET_WORD = "Word" # 请求头模拟普通浏览器,避免被基础反爬拦截 HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 用with上下文管理器自动处理文件关闭,显式指定utf8编码 with open('import.txt', 'r', encoding='utf-8') as f_in, open('output.txt', 'w', encoding='utf-8') as f_out: # 逐行读取链接,去除首尾空白、换行 for line in f_in: page_link = line.strip() # 跳过空行 if not page_link: continue try: # 传入正确的单个链接变量,设置超时时间 res = requests.get(page_link, headers=HEADERS, timeout=10) # 自动根据页面头设置编码,避免乱码导致关键词匹配失败 res.encoding = res.apparent_encoding # 判断关键词是否存在于页面文本中 if TARGET_WORD in res.text: # 把符合要求的链接写入输出文件 f_out.write(page_link + "\n") print(f"匹配成功,已保存链接:{page_link}") except Exception as e: print(f"请求链接{page_link}出错:{str(e)}") continue
代码说明
- 用
with语句管理文件读写,不需要手动调用close,程序自动释放文件资源 - 逐行读取链接后用
strip()去掉换行、空格,跳过空行避免无效请求 - 增加了基础请求头和超时设置,降低被反爬拦截、程序卡死的概率
- 加了异常捕获,单个链接请求失败不会中断整个程序
- 匹配到关键词后直接写入原始链接,完全符合需求
- 输出文件用
w模式打开,不需要额外调用truncate清空,打开时自动覆盖旧内容
内容的提问来源于stack exchange,提问作者user19033073
相关产品推荐
相关产品推荐

