【发布时间】:2019-11-19 02:53:11
【问题描述】:
我的代码没有将结果正确存储到我创建的 csv 文件中。
我需要从U.S. Congress website 中提取每张账单的号码、赞助商和派对的数据。
在解释器中运行代码时,它可以正常工作并给我想要的结果。但是,在我创建的 csv 文件中,我遇到了以下问题之一:
- 同一赞助方每张帐单(正确的帐单编号,但他们都共享同一个赞助方)
SPONS PARTY NBILL
Name D 7402
Name D 7401
...
有趣的是,我找到的名字(Grijalva,Raul)对应于 Bill 7302。
- 正确的Sponsor-Party,但只是第100个账单,即每100个Sponsor-Party我有7402;7302等等。
如上所述,不同的赞助商和参与方,但账单数量仅每 100 对赞助商/参与方发生变化,并且变为 100 乘 100(前 100 对为 7402,第二对为 7302,依此类推)
- 正确的赞助方但没有账单,以下代码会发生这种情况
编辑:如果我将Congress=[-]+[-]+[-] 放在代码的末尾,我就属于第一种情况。
with open('115congress.csv', 'w') as f:
fwriter=csv.writer(f, delimiter=';')
fwriter.writerow(['SPONS', 'PARTY', 'NBILL'])
BillN=[]
Spons=[]
Party=[]
for j in range(1, 114):
hrurl='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='+str(j)
hrpage=requests.get(hrurl, headers=headers)
data=hrpage.text
soup=BeautifulSoup(data, 'lxml')
for q in soup.findAll('span', {'class':'result-item'}):
for a in q.findAll('a', href=True, text=True, target='_blank'):
secondindex=secondindex+1
if (secondindex/2).is_integer():
continue
Spons=a.text
print(Spons)
SPONS=Spons
if 'R' in Spons:
Party='Republican'
if 'D' in Spons:
Party='Democratic'
print(Party)
PARTY=Party
Congress115=[SPONS]+[PARTY]
fwriter.writerow(Congress115)
for r in soup.findAll('span', {'class':'result-heading'}):
index=index+1
if (index/2).is_integer():
continue
Bill=r.findNext('a')
BillN=Bill.text
print(BillN)
NBILL=BillN
Congress115= [SPONS]+[PARTY]+[NBILL]
fwriter.writerow(Congress115)
f.close()
如何修复写入 CSV 的代码,以免出现这些问题?
【问题讨论】:
-
您确定要将
Congress115变量写入csv 文件两次吗?一次使用Congress115=[SPONS]+[PARTY],另一次使用Congress115= [SPONS]+[PARTY]+[NBILL]。在for r in soup.findAll('span', {'class':'result-heading'}):处,甚至您的代码缩进也感觉有点不对劲。鉴于您的代码所做的工作,我强烈认为这个循环及其内容应该是for q in soup.findAll('span', {'class':'result-item'}):循环的一部分。 -
如果我理解正确,您建议将 Congress115=[-]+[-]+[-] 放在代码的末尾并在前一个循环中包含 for r 循环?我试试,非常感谢!
-
您能否edit 您的问题显示输出 CSV 文件的几行应该是什么样子?即您的预期输出
标签: python csv web-scraping beautifulsoup