Как сделать цикл Python, который пишет в CSV в разных строках?

Я новичок в Python, и у меня есть скрипт, который захватывает название финансовой компании Yahoo, сектор и отраслевую информацию на основе тикеров, которые я хочу, и все записывается в CSV в разных ячейках, но в одной строке. Как сделать так, чтобы каждая строка excel отображала название компании, Сектор и отрасль на тикер, который я ввожу?

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import csv

def get_all():
    results = []
    for x in tickers:
        try:
            website = "http://finance.yahoo.com/quote/{0}/profile?p={0}".format(x)
            driver = webdriver.Chrome()
            driver.get(website)
            wait = WebDriverWait(driver, 10)
            company = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="main-0-Quote-Proxy"]/section/div[2]/section/div/div[1]/div/h3')))
            results.append(company.text)
            wait = WebDriverWait(driver, 10)
            sector = wait.until(EC.visibility_of_element_located((By.XPATH, "//span[. = 'Sector']/following-sibling::strong")))
            results.append(sector.text)
            wait = WebDriverWait(driver, 10)
            industry = wait.until(EC.visibility_of_element_located((By.XPATH, "//span[. = 'Industry']/following-sibling::strong")))
            results.append(industry.text)
            driver.close()
        except Exception as e: 
            error_msg = "Error on {0}-{1}".format(x,e) 
            results.append(error_msg)
            driver.close()
    print(results)
    out = csv.writer(open("yahoo_companies.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
    out.writerow(results)

# Enter tickers below
tickers = ['COST', 'BBY']
get_all()

Например, я хочу, чтобы это дало мне (каждая точка с запятой была бы другой ячейкой):

Строка 1: Costco Wholesale Corporation; Услуги; Скидки, Разнообразные Магазины

Строка 2: Best Buy Co., Инк.; Услуги; Магазины Электроники

Строка 3: Etc…

Прямо сейчас я получаю (все в строке 1): Costco Wholesale Corporation; услуги; скидка, разнообразные магазины; Best Buy Co., Инк.; Услуги; Магазины Электроники

1 ответ

  1. В конце каждой строки у вас должен быть символ новой строки (\n\r), чтобы программа редактирования CSV поняла.

    Если вы добавляете каждую строку в свой собственный список и добавляете ее в основной список «результаты», writerows добавит для вас окончание строки для каждого элемента.

    См. следующий код.

    def get_all():
        results = []
        for x in tickers:
            # declare a new list to hold the values in each row
            newRow = []
            try:
                website = "http://finance.yahoo.com/quote/{0}/profile?p={0}".format(x)
                driver = webdriver.Chrome()
                driver.get(website)
                wait = WebDriverWait(driver, 10)
                company = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="main-0-Quote-Proxy"]/section/div[2]/section/div/div[1]/div/h3')))
                # appending to newRow list
                newRow.append(company.text)
                wait = WebDriverWait(driver, 10)
                sector = wait.until(EC.visibility_of_element_located((By.XPATH, "//span[. = 'Sector']/following-sibling::strong")))
                # appending to newRow list
                newRow.append(sector.text)
                wait = WebDriverWait(driver, 10)
                industry = wait.until(EC.visibility_of_element_located((By.XPATH, "//span[. = 'Industry']/following-sibling::strong")))
                # appending to newRow list
                newRow.append(industry.text)
                driver.close()
            except Exception as e: 
                error_msg = "Error on {0}-{1}".format(x,e) 
                # appending to newRow list
                newRow.append(error_msg)
                driver.close()
            # append the newRow list into 'results list'
            results.append(newRow)
        print(results)
        outFile = open("yahoo_companies.csv","w")
        out = csv.writer(outFile, delimiter=',',quoting=csv.QUOTE_ALL)
        # see the following line, its writerows (plural). different to your code.
        out.writerows(results)
        outFile.close()