【问题标题】:AttributeError: 'str' object has no attribute 'keys' when trying to use writerowAttributeError:“str”对象在尝试使用 writerow 时没有属性“keys”
【发布时间】:2019-05-19 19:15:56
【问题描述】:

尝试编写一个python scraper,将网页中的数据抓取到csv文件

如果我删除行 dataFrameCleaned = cleanDataUp(dataFrame) 也尝试改变我编写 python 文件的方式 csvData(dataFrameCleaned) 代码运行,但它不会将数据写入 csv 文件

'''
write data to csv
'''
def csvData(dataFrame):
    with open('threads.csv', 'w+', newline='', encoding='utf8') as csvfile:
        fieldnames = ['post id', 'name', 'date of the post', 'post body']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        for posts in dataFrame:
            writer.writerow(posts)
        print('file write complete')


'''
defaults
'''
if __name__ == "__main__":
    path = str(os.path.dirname(os.path.realpath(__file__)))+'/data/'
    reload(sys)
    fieldnames = ['post id', 'name', 'date of the post', 'post body']
    dataFrame = pd.DataFrame(columns=fieldnames)
    url = 'http://www.oldclassiccar.co.uk/forum/phpbb/phpBB2/viewtopic.php?t=12591'
    urlList = [url]

    soup = get_soup(url)

    while True:
        newUrlSuffix = getURL(soup)
        if newUrlSuffix == '':
            break
        newUrl = 'http://www.oldclassiccar.co.uk/forum/phpbb/phpBB2/' + newUrlSuffix
        print("Adding new URL to list..")
        urlList.append(newUrl)
        soup = get_soup(newUrl)
    
    for link in urlList:
        print("Getting data from URL:" + link+ '\n\n\n')
        dataFrameNew = extractData(link)
        dataFrame = pd.concat([dataFrame,dataFrameNew])
    dataFrameCleaned = cleanDataUp(dataFrame)
    csvData(dataFrameCleaned)

The function for cleanDataUp
def cleanDataUp(dataFrame):
    dataFrame = dataFrame.reset_index(drop=True).dropna()
    return dataFrame

Traceback (most recent call last):
  File "scraper.py", line 127, in <module>
    csvData(dataFrameCleaned)
  File "scraper.py", line 96, in csvData
    writer.writerows(posts)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/csv.py", line 158, in writerows
    return self.writer.writerows(map(self._dict_to_list, rowdicts))
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/csv.py", line 148, in _dict_to_list
    wrong_fields = rowdict.keys() - self.fieldnames
AttributeError: 'str' object has no attribute 'keys'

【问题讨论】:

    标签: python


    【解决方案1】:

    writer.writerow(posts) 中,writer 的类型为 csv.DictWriter,参数应该是字典,例如

    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    

    但正如错误所说,posts 是字符串而不是字典,因此错误 AttributeError: 'str' object has no attribute 'keys'

    也许您的 cleanDataUp(dataFrame) 正在返回一个字符串列表,但您想要一个字典列表,您需要检查该函数以确保它返回正确的输出以传递给 csvData() 函数

    【讨论】:

    • 我的cleanDataUp函数定义为:def cleanDataUp(dataFrame): dataFrame = dataFrame.reset_index(drop=True).dropna() return dataFrame
    • 嗨@MEANStack 请将其添加到问题中,不幸的是,我不是熊猫专家,所以我无法为您提供此功能!但是你要确保dataFrame 是一个字典列表
    • 太棒了!乐意效劳! :) 请考虑通过单击答案旁边的勾号将答案标记为已接受@MEANStack 我还建议您阅读:stackoverflow.com/help/someone-answers 祝您有美好的一天:)
    猜你喜欢
    • 2023-03-09
    • 2019-07-30
    • 2021-01-15
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多