在python中模拟写入CSV并追加到列表的最佳方法

问题描述

背景:
我有以下代码,这些代码使用Selenium从该Simply Recipe Index URL查找链接列表并将其存储在linklist列表中。然后,代码循环访问linklist,对于每个链接,它将下载配方文本,然后将数据存储到recipe_list

from bs4 import BeautifulSoup
import requests
from splinter import browser
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import selenium
import time
import csv

#set up chromedriver for WINDOWS
driver=webdriver.Chrome('chromedriver.exe')
url = "https://www.simplyrecipes.com/index/"
driver.get(url) 
response=requests.get(url)
soup=BeautifulSoup(response.text,'html.parser')

#set up chromedriver for MAC
driver=webdriver.Chrome("/Users/williamforsyth/Documents/uc_davis/Homework_Repos/group-project-2/Kathryn/chromedriver")
url = "https://www.simplyrecipes.com/index/"
driver.get(url) 
response=requests.get(url)
soup=BeautifulSoup(response.text,'html.parser')

linklist=[]
links=soup.find_all('a')
for link in links:
    linklist.append(link)
linklist_text=[]
for i in range(164,1068):
    linklist_text.append(linklist[i].text)

recipe_list=[]
for link in linklist_text:
    time.sleep(0.3)
    target=driver.find_element_by_partial_link_text(link)
    target.click()
    time.sleep(0.1)
    cards = driver.find_elements_by_class_name("Grd-title-link")
    for i in range(0,len(cards)):
        try:
            newcards = driver.find_elements_by_class_name("Grd-title-link")
            time.sleep(0.3)
            newcards[i].click()
            time.sleep(0.3)
            recipe=driver.find_element_by_id("sr-recipe-callout")
            recipe_list.append(recipe.text)
            driver.back()
            time.sleep(0.3)
        except:
            continue
    driver.get(url)

问题:
记住,此代码未使用我现在想实现的功能编写,即我想附加{{1}从每个循环到一个csv文件。这是我想要尝试添加到CSV以及现在执行的代码代码,现在添加 recipe_list

recipe.text

是否有一种简单的方法可以实现这一目标,而不必重新编写整个代码

解决方法

编写包含单列配方文本的CSV的一种简单方法是在编写recipe_list之后使用csv模块:

import csv
with open('recipies.csv',mode='w',newline='') as fileobj:
    csv.writer(fileobj).writerows([col] for col in recipe_list)

这将在您每次运行时覆盖收件人文件。您可以使用mode='a'进行追加。

,

您要“ ..将每个循环中的配方。文本添加到csv文件中”

如果您只想将其转储到TRY循环的每个迭代中,则可以导入阅读器,并将“ recipe_list.append(recipe.text)”替换为:

import csv

with open('recipe_output.csv','w',newline='') as csvfile:
    writer = csv.writer(csvfile,delimiter=',')
    writer.writerow(recipe.text)

在循环开始之前的某处设置“ with open()”和“ writer =“行,并使用此“ writer.writerow”行替换当前的“ recipe_list.append(recipe.text)”行。这样,您就可以将每个循环的文件转储到CSV文件中,而不是从末尾的附加列表中转储很多