Python 属性错误:';str';对象没有属性';钥匙';尝试使用writerow时

Python 属性错误:';str';对象没有属性';钥匙';尝试使用writerow时,python,Python,正在尝试编写一个pythonscraper,它将数据从网页刮到csv文件 如果删除dataFrameCleaned=cleanDataUp(dataFrame)行,也尝试更改编写python文件的方式 csvData(数据帧已清理) 代码运行时不会将数据写入csv文件 ''' write data to csv ''' def csvData(dataFrame): with open('threads.csv', 'w+', newline='', encoding='utf8') a

正在尝试编写一个pythonscraper,它将数据从网页刮到csv文件

如果删除dataFrameCleaned=cleanDataUp(dataFrame)行,也尝试更改编写python文件的方式 csvData(数据帧已清理) 代码运行时不会将数据写入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

回溯(最近一次呼叫最后一次):
文件“scraper.py”,第127行,在
csvData(数据帧已清理)
csvData中第96行的文件“scraper.py”
writer.writerows(posts)
writerows中的文件“/usr/local/ceral/python/3.7.3/Frameworks/python.framework/Versions/3.7/lib/python3.7/csv.py”,第158行
返回self.writer.writerows(映射(self.\u dict\u to\u list,rowdicts))
文件“/usr/local/ceral/python/3.7.3/Frameworks/python.framework/Versions/3.7/lib/python3.7/csv.py”,第148行,在目录列表中
错误的_fields=rowdict.keys()-self.fieldnames
AttributeError:“str”对象没有属性“keys”
writer.writerow(posts)
中,如果
writer
为类型,则参数应为字典,例如

writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
但是正如错误所说,
posts
是字符串而不是字典,因此错误
AttributeError:'str'对象没有属性'keys'

也许您的
cleandatup(dataFrame)
正在返回字符串列表,但是您想要一个字典列表,您需要检查该函数以确保它返回正确的输出以传递给
csvData()
writer.writerow(posts),其中
writer
为类型,这个论点应该是一本词典

writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
但是正如错误所说,
posts
是字符串而不是字典,因此错误
AttributeError:'str'对象没有属性'keys'


也许您的
cleandatup(dataFrame)
正在返回字符串列表,但是如果您想要字典列表,则需要检查该函数以确保它返回正确的输出,并将其传递给
csvData()
function

我的cleandatup函数定义为:def cleandatup(dataFrame):dataFrame=dataFrame.reset\u index(drop=True).dropna()return dataFrameHi@MEANStack请将其添加到问题中,不幸的是,我不是熊猫专家,因此我无法帮助您使用此函数!但您要确保
dataFrame
是一个字典列表太棒了!很乐意帮助!:)请考虑将答案标记为“单击”旁边的滴答键“MealStad,我也建议您阅读:StasOfFuff.com /Prave/Adple一个答案有一个好的天:”我的CurdiaTaaUp函数定义为:DEF CurnAtAtUP(DATAFRAME):DATAFRAME= DATAFRAME.RESETHOLD索引(ROUP=TRUE).DROPNA()return dataFrameHi@MEANStack请将其添加到问题中,不幸的是,我不是熊猫专家,因此我无法帮助您完成此功能!但是你要确保
dataFrame
是一个字典列表太棒了!很乐意帮忙!:)请考虑将答案标记为“点击”旁边的记号“@栈”,我也建议您阅读:StasOfFuff.com /Prave/Frimple Read有一个好的一天: