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

网页爬虫抓取二战希特勒演讲写入CSV遇问题,求实现方案建议

解决你的爬虫CSV写入问题

让我们一步步拆解你代码里的问题,然后给出更简洁可靠的实现方案:

核心问题分析

  1. 数组赋值错误:你用np.array([])初始化了空数组,但直接通过string_list[jsin] = mystring赋值会报错——因为空numpy数组没有足够的长度容纳新元素,应该用列表的append()方法来动态添加内容。
  2. 字典构建逻辑错误:最后遍历string_list时,speech是列表里的文本元素,不是索引,string_list[speech]这种写法完全错误,而且你只是每次创建字典,却没有把这些字典收集起来,更没有写入CSV的操作,自然看不到Speaker和Year的内容。
  3. 冗余的变量处理:mystring的重置逻辑没问题,但用numpy数组存储文本其实没必要,普通Python列表足够灵活。

推荐实现方案:字典列表转DataFrame写入CSV

用字典列表+Pandas的方式会更清晰易维护,比直接写入CSV更不容易出错,而且能轻松保证列顺序正确。

修改后的代码如下:

import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd

# 假设main_page是你定义好的主页URL
main_sauce = urllib.request.urlopen(main_page).read()
main_soup = BeautifulSoup(main_sauce, 'lxml')

driver = webdriver.Chrome()  # 需提前配置对应浏览器驱动
driver.get(main_page)
list_html_links = driver.find_elements_by_tag_name('a')
list_links = []
for i in list_html_links:
    list_links.append(i.get_attribute('href'))
driver.quit()

counter = 0
# 用列表存储每个演讲的完整数据字典
speeches_data = []

for j in list_links:
    if 26 <= counter < 47:
        # 跳过不需要的链接索引
        if counter not in [29, 31, 33, 34, 35, 37, 38, 39, 43, 45]:
            sauce = urllib.request.urlopen(j).read()
            soup = BeautifulSoup(sauce, 'lxml')
            # 移除所有a标签
            for a in soup.find_all('a'):
                a.extract()
            # 拼接所有p标签文本,同时去除多余空格
            mystring = "\n".join([p.text.strip() for p in soup.body.find_all('p')])
            # 直接构建包含所有字段的字典,添加到列表
            speeches_data.append({
                'Speech': mystring,
                'Speaker': 'Adolf Hitler',
                'Year': '1939-45'
            })
    counter += 1

# 转成DataFrame并写入CSV,index=False避免生成多余索引列
df = pd.DataFrame(speeches_data)
df.to_csv('hitler_speeches.csv', index=False, encoding='utf-8')

关键改进点说明

  • 用speeches_data列表存储每个演讲的完整字典,确保Speaker和Year能和对应的演讲文本正确绑定。
  • 用"\n".join([p.text.strip() for p in ...])替代循环拼接,更简洁高效,同时清理文本中的多余空格。
  • 借助Pandas的to_csv()方法自动处理列头、分隔符转义等细节,避免手动写入CSV时容易出现的格式错误。

关于直接写入CSV vs 字典转DataFrame

直接写入CSV需要手动处理列头、换行、特殊字符转义等问题,容易出错;而用Pandas的话,它会自动处理这些细节,代码更简洁,后续如果需要修改列结构、清洗数据(比如去重、过滤空文本)也更方便,所以更推荐后者。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:02:46