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

如何将URL列表与对应爬虫结果匹配追加为DataFrame两列

代码补充修改方案

你现有代码存在两个核心问题:一是没有做爬取结果的有序存储,无法和URL做一一绑定;二是文本清洗逻辑缩进错误,写在了移除script/style标签的内层循环里,会重复执行文本提取操作。按以下步骤补充修改即可得到目标结构的DataFrame:

  • 新增pandas库导入,用于生成结构化DataFrame
  • 初始化空列表作为结果存储容器,按爬取顺序依次存入URL和对应文本的配对数据,保证顺序和原URL列表完全对应
  • 修正文本清洗逻辑的缩进,把提取、清洗文本的代码移到移除冗余标签的循环外层,避免重复计算
  • 单次请求、文本清洗完成后,将当前URL和对应清洗后的文本组成元组,追加到结果存储列表中
  • 所有链接爬取完成后,将存储的配对列表传入DataFrame构造方法,指定列名即可

修改后完整代码

from bs4 import BeautifulSoup
import requests
from time import sleep
from random import randint
import pandas as pd

urls = ['url1','url2']
# 初始化结果存储列表
scrape_results = []
# 请求头可以放在循环外,不需要每次请求重新定义
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',}

for link in urls:
    sleep(randint(11,23))
    try:
        req = requests.get(link, headers=headers, timeout=10)
        # 请求失败直接抛出异常,避免解析错误页面
        req.raise_for_status()
        soup = BeautifulSoup(req.content, features="lxml")
        # 移除script、style标签
        for script in soup(["script", "style"]): 
            script.extract()    
        # 文本清洗逻辑移到内层循环外,避免重复执行
        text = soup.get_text() 
        lines = (line.strip() for line in text.splitlines())
        chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
        text = '\n'.join(chunk for chunk in chunks if chunk)
        # 将当前url和对应爬取结果配对存入列表
        scrape_results.append((link, text))
    except Exception as e:
        # 请求/解析失败时存入错误信息,保证长度和url列表一致,不会错位
        scrape_results.append((link, f"爬取失败: {str(e)}"))

# 生成目标DataFrame
df = pd.DataFrame(scrape_results, columns=['col1', 'col2'])
print(df)

额外优化点:把固定的请求头移到了循环外,不需要每次请求重复定义;新增了请求异常捕获,单个链接爬取失败不会中断整个任务,同时能保证结果行数和URL列表长度完全一致,不会出现匹配错位。

运行后输出的结构和预期完全一致:

col1col2
url1A Details
url2B Details

内容的提问来源于stack exchange,提问作者Dre Day

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:15:39