网页爬虫抓取二战希特勒演讲写入CSV遇问题,求实现方案建议
解决你的爬虫CSV写入问题
让我们一步步拆解你代码里的问题,然后给出更简洁可靠的实现方案:
核心问题分析
- 数组赋值错误:你用
np.array([])初始化了空数组,但直接通过string_list[jsin] = mystring赋值会报错——因为空numpy数组没有足够的长度容纳新元素,应该用列表的append()方法来动态添加内容。 - 字典构建逻辑错误:最后遍历
string_list时,speech是列表里的文本元素,不是索引,string_list[speech]这种写法完全错误,而且你只是每次创建字典,却没有把这些字典收集起来,更没有写入CSV的操作,自然看不到Speaker和Year的内容。 - 冗余的变量处理:
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
相关产品推荐
相关产品推荐

