Python Requests读取CSV传入URL时出现InvalidSchema报错的解决办法
核心报错成因
- 触发
InvalidSchema报错的本质是传入requests.get()的参数不是符合要求的合法URL格式 csv.reader的迭代逻辑决定了,每循环一次拿到的url_row是按CSV分隔符拆分后的列表结构,哪怕你的CSV整行只有1个URL、没有任何逗号分隔符,读出来的内容也是类似['https://www.website.com/page1/page2/']的单元素列表,直接把这个列表传给requests,会被序列化成带方括号、引号的字符串,完全不符合URL格式规范- 之前尝试将列表转为字符串未解决问题,大概率是直接用
str(url_row)做转换,这种操作会把列表的所有格式字符一起保留进字符串,最终生成的就是报错提示里看到的"['https://www.website.com/page1/page2/']"这类无效URL,requests无法从中识别出http/https协议头,自然匹配不到对应的连接适配器
分步修正方法
- 正确提取列表内的真实URL:不要直接把整行列表作为请求参数,定位URL在列表中的索引位置,取出对应元素后调用
strip()方法,清理URL首尾的空格、换行等不可见残留字符 - 提取完成后可快速校验URL格式:打印提取后的字符串,确认内容直接以
http://或https://开头,外层没有多余的引号、方括号字符 - 替换代码中为空的
User-Agent值:空UA很容易被站点反爬策略直接拦截,填充常规浏览器的UA字符串可大幅提高请求成功率 - 给请求加上超时参数,避免目标站点无响应时程序永久卡住
- 增加空行、空URL的跳过逻辑,避免读取CSV时遇到空行触发索引越界报错
修正后的可运行参考代码
import csv import requests from bs4 import BeautifulSoup # 配置常规浏览器请求头,避免空UA被拦截 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' } def get_html(url): # 配置10秒超时,避免无响应时程序卡死 r = requests.get(url, headers=HEADERS, timeout=10) # 自动匹配页面编码,避免乱码 r.encoding = r.apparent_encoding return r.text def get_page_data(html): soup = BeautifulSoup(html, 'lxml') pass def main(): with open('p.csv', newline='', encoding='utf-8') as File: reader = csv.reader(File) for url_row in reader: # 跳过CSV中的空行 if not url_row: continue # 从行列表中提取URL,清理首尾残留字符 target_url = url_row[0].strip() # 跳过空URL内容 if not target_url: continue print(f"正在请求:{target_url}") get_page_data(get_html(target_url)) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者dog3000
相关产品推荐
相关产品推荐

