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

Python网页爬取:美国国会法案数据无法正确写入CSV的修复咨询

修复国会法案数据爬取的CSV写入异常问题

看起来你遇到的核心问题是法案编号和提案人信息没有一一绑定,代码里分开遍历了两类元素,导致数据对应关系完全混乱。另外还有变量未初始化、重复写入、逻辑漏洞等小问题,我来一步步帮你修复:

问题根源分析

  • 你先遍历所有提案人信息并写入一次,再遍历所有法案编号又写入一次,这就导致两组数据完全脱节,要么重复用同一个提案人,要么重复用同一个法案编号。
  • secondindex和index变量没有初始化,运行时会直接报错。
  • 党派判断逻辑有漏洞:如果提案人名称里同时包含R/D,或者都不包含,Party的值会出错或保持上一次的结果。
  • 存在重复写入CSV的逻辑,导致数据行混乱。

修复后的代码

import csv
import requests
from bs4 import BeautifulSoup

# 假设你的headers已经定义过了,示例UA可根据实际情况替换
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}

with open('115congress.csv', 'w', newline='', encoding='utf-8') as f:
    fwriter = csv.writer(f, delimiter=';')
    # 写入表头
    fwriter.writerow(['SPONS', 'PARTY', 'NBILL'])

    for page_num in range(1, 114):
        hrurl = f'https://www.congress.gov/search?q=%7B%22source%22%3A%22legislation%22%2C%22congress%22%3A%22115%22%2C%22type%22%3A%22bills%22%7D&page={page_num}'
        hrpage = requests.get(hrurl, headers=headers)
        soup = BeautifulSoup(hrpage.text, 'lxml')

        # 遍历每个法案条目,把编号和提案人信息绑定在一起
        for result_item in soup.find_all('div', class_='search-result-item'):
            # 获取法案编号
            bill_heading = result_item.find('span', class_='result-heading')
            if not bill_heading:
                continue
            bill_link = bill_heading.find_next('a')
            bill_num = bill_link.text.strip() if bill_link else 'N/A'

            # 获取提案人及党派
            sponsor_info = result_item.find('span', class_='result-item')
            if not sponsor_info:
                continue
            sponsor_link = sponsor_info.find('a', target='_blank')
            sponsor_name = sponsor_link.text.strip() if sponsor_link else 'N/A'
            
            # 修正党派判断逻辑,精准匹配括号内的党派标识
            if '(R)' in sponsor_name:
                party = 'Republican'
            elif '(D)' in sponsor_name:
                party = 'Democratic'
            else:
                party = 'Unknown'

            # 写入完整的一组数据
            fwriter.writerow([sponsor_name, party, bill_num])
            print(f"已写入: {sponsor_name} | {party} | {bill_num}")

关键修复点说明

  1. 绑定数据对应关系:不再分开遍历提案人和法案编号,而是针对每个search-result-item(单个法案条目)同时提取编号和提案人信息,确保每组数据一一对应。
  2. 初始化与容错处理:增加了空值判断,避免因为页面结构变化导致的报错,同时给无法识别的党派设置默认值Unknown。
  3. 简化索引逻辑:去掉了冗余的secondindex和index判断,直接通过元素的父子/兄弟关系定位目标内容,更可靠。
  4. 规范变量命名:使用更清晰的变量名,避免大小写混淆导致的值覆盖问题。
  5. 优化写入逻辑:每个法案条目只写入一次CSV,不会产生重复或缺失的字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:43:20