【问题标题】:TypeError: __init__() got multiple values for argument 'fieldnames'TypeError:__init__() 为参数“字段名”获取了多个值
【发布时间】:2018-10-18 19:22:45
【问题描述】:

我已经在网站上进行了一次网络抓取以进行练习,我正在尝试将数据放入可以导出到 csv 的 pandas 数据帧中,当我到达某个点时,TypeError: __init__() got multiple values for argument 'fieldnames' 会出现。我想使用 csv 模块编写文件。有人可以解释错误是如何发生的以及如何解决它吗?我的代码如下:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import csv

my_url = 'https://www.allagents.co.uk/find-agent/london/'

uClient = uReq(my_url)

page_html = uClient.read()

uClient.close()

page_soup = soup(page_html, 'html.parser')

containers = page_soup.findAll('div', {'class':'itemlabel3'})

filename = "webscrape.csv" 
records = []

for container in containers:
    comp_name   = container.find('div', {'class':'labelleft2 col-md-10'}).div.h4.a.text

    address=container.find('div', {'class':'labelleft2 col-md-10'}).div.p.text.replace('\n','')

    tel         = container.find('div', {'class':'labelleft2 col-md-10'}).div.find('p', {'style':'clear: both; margin-bottom: 15px;'}).strong.text

    records.append({'company': comp_name, 'address': address, 'telephone': tel})
writer = csv.DictWriter(filename, "w", fieldnames=['company', 'address', 'telephone'])

writer.writeheader()

for r in records:
    writer.writerow(r)

出现错误:

writer = csv.DictWriter(filename, "w", fieldnames=['company', 'address', 'telephone'])

在此先感谢,如果有任何帮助,我们将不胜感激。

【问题讨论】:

  • 哪行代码导致错误?
  • 什么版本的 Python?
  • @jwm:只有 Python 3 有 urllib.request 作为模块。
  • @HD:请edit您的问题添加缺少的详细信息。
  • 版本:Python 3.6.5

标签: python csv web-scraping


【解决方案1】:

我怀疑您对DictWriter 的调用参数过多:

writer = csv.DictWriter(filename, "w", fieldnames ...
                                   ^
                           what is this?

我认为应该是:

f = open(filename, 'w')
writer = csv.DictWriter(f, fieldnames ...

在您的调用中,fieldnames 参数被分配了"w",但您也将自己的版本作为列表提供。

【讨论】:

  • 它只接受一个打开的文件对象,而不是一个文件名。
  • 这不是报告错误的原因,但我会在下一步添加。
【解决方案2】:

csv.DictWriter 中,前两个参数是文件对象(不是文件名),然后是fieldnames(您指定为"w")。试试这个:

with open(filename, 'w') as f:
    writer = csv.DictWriter(f, ['company', 'address', 'telephone'])
    # write stuff in this block

【讨论】:

  • "w" 是文件模式,应该传递给open() 调用。
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多