如何修改Python爬虫代码以正确抓取密西西比州议会网站的法案内容?
解决密西西比州议会网站法案爬取问题
问题根源
原代码的核心问题有两个:
- 选择器
soup.select('tbody')仅选中页面的<tbody>容器本身,提取的文本是所有内容混在一起的字符串,无法拆分单个法案信息; - 后续用
pd.DataFrame.from_dict的方式错误,导致最终CSV输出异常。
正确的思路是定位到每个法案对应的表格行,再提取每行内的字段内容。
修正后的代码
import requests from bs4 import BeautifulSoup import pandas as pd urls = ['http://www.legislature.ms.gov/legislation/all-measures/'] bills_data = [] for url in urls: r = requests.get(url) soup = BeautifulSoup(r.content, 'html.parser') # 替换选择器,定位到tbody下的每个法案行(tr元素) bill_rows = soup.select('tbody tr') for row in bill_rows: cells = row.find_all('td') # 确保行内有足够的单元格,避免索引越界 if len(cells) >= 4: bill_info = { '法案编号': cells[0].text.strip(), '法案标题': cells[1].text.strip(), '状态': cells[2].text.strip(), '提交日期': cells[3].text.strip() } bills_data.append(bill_info) # 转换为DataFrame并保存CSV df = pd.DataFrame(bills_data) df.to_csv('3-New Bills.csv', index=False, encoding='utf-8')
关键修改说明
- 选择器替换:将
tbody改为tbody tr,直接定位到每个独立的法案行,而非整个表格容器; - 数据结构优化:用列表存储每个法案的字典,每个字典对应CSV的一行数据,结构清晰且符合DataFrame的生成要求;
- 字段清洗:用
strip()去除文本中的多余空白字符,保证数据整洁; - CSV保存优化:添加
index=False避免生成冗余索引列,指定编码防止中文(若有)乱码。
内容的提问来源于stack exchange,提问作者Anterthorp
相关产品推荐
相关产品推荐

