Python读取Excel URL触发requests.InvalidSchema错误求助
解决requests.exceptions.InvalidSchema错误:正确读取Excel中的URL列表
问题根源
你的两种实现方式都没有正确提取出纯字符串格式的URL列表:
- 初始代码用
df.values.tolist()返回的是嵌套列表(每个URL被包裹在子列表里,比如["https://xxx"]),requests.get()接收的是列表而非字符串,无法识别为合法URL。 - 修改后的代码直接返回
[df],把整个DataFrame对象传入循环,requests最终拿到的是DataFrame的字符串化内容(就是报错里显示的表格格式文本),完全不是有效URL。
修正方案
1. 正确提取URL列表
从单列DataFrame中提取纯字符串列表,用df[0].tolist()或者df.squeeze().tolist()(后者更灵活,当DataFrame只有一列时会转为Series再转列表)。
2. 增加异常处理
批量爬取时加入异常捕获,避免单个URL出错导致整个程序中断,同时可以记录无效URL便于排查。
修正后的完整代码
from bs4 import BeautifulSoup import requests import csv import pandas as pd def get_urls_from_excel_file(): df = pd.read_excel(r'C:\Users\Douglas\Documents\Python Resources\PO Detachment Project\URL List (version 1).xlsx', header=None) # 提取第0列的纯字符串列表 return df[0].tolist() def main(): urls = get_urls_from_excel_file() with open(r"C:\Users\Douglas\Documents\output.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # 写入表头 writer.writerow(["地址", "城市", "州", "邮编"]) for idx, url in enumerate(urls, 1): print(f"正在抓取第{idx}个URL: {url}") try: # 增加超时设置,避免请求挂起 resp = requests.get(url, timeout=10) # 检查请求是否成功 resp.raise_for_status() soup = BeautifulSoup(resp.text, "html.parser") descs = soup.select(".Article-block .DefList .DefList-description") # 确保有足够的元素,避免索引越界 if len(descs) >=5: addr1 = descs[1].text.strip() city = descs[2].text.strip() state = descs[3].text.strip() zipcode = descs[4].text.strip() writer.writerow([addr1, city, state, zipcode]) else: print(f"URL {url} 缺少目标元素,跳过") except requests.exceptions.RequestException as e: print(f"URL {url} 请求失败: {str(e)}") continue except IndexError as e: print(f"URL {url} 元素索引错误: {str(e)}") continue if __name__ == "__main__": main()
额外优化建议
- 加入请求头(
headers参数)模拟浏览器请求,避免被网站反爬拦截。 - 对URL做预处理,比如去除首尾空格、检查是否包含
http://或https://前缀,避免无效URL。 - 批量爬取时加入间隔时间(
time.sleep(1)),降低对目标网站的请求压力。
内容的提问来源于stack exchange,提问作者Gilbert99
相关产品推荐
相关产品推荐

