You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:20:31