Search code examples
pythonpandasexport-to-csv

Writing to CSV and only getting one column


I'm trying to write to CSV file and am only getting 1 column with the company names. Does anyone know how I can write to a CSV file and get all the data with column headings?

Printed Output

'Agilent Technologies\n6,319\n2,912\n441\n1,619\n321\n189\n189\n1,347\n81
\n236\n1,210\n19.2%\n307', 'Alcoa\n12,152\n9,153\n31\n227\n664\n390\n390\n2,039\n195\n19\n429\n3.5%\n190',

Current Output after writing to CSV

Agilent Technologies
Alcoa

Desired Output after writing to CSV

Desired Output in CSV

Full Code

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
import pandas as pd
import requests
import csv
  
options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
ser = Service("./chromedriver.exe")
browser = driver = webdriver.Chrome(service=ser)

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
wait = WebDriverWait(driver, 30)
driver.get("https://stockrover.com")
wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div[1]/div/section[2]/div/ul/li[2]"))).click()
user = driver.find_element(By.NAME, "username")
password = driver.find_element(By.NAME, "password")
user.clear()
user.send_keys("******")
password.clear()
password.send_keys("*******")
driver.find_element(By.NAME, "Sign In").click()
wait = WebDriverWait(driver, 30)


stocks_list = []
try:
    while True:
        # Print the stock symbols
        stocks_list.extend([my_elem.text for my_elem in WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table[id^='gridview-1072-record']")))])
        # Click on next page button
        wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="button-1157"]'))).click()
except:
        print("Next button disabled")
print(stocks_list) # Prints entire list of stocks

df=pd.DataFrame(stocks_list)
df.to_csv('table.csv')

Solution

  • You may just perform this CSV Module in the end add:

    stocks_lists = [x.split('\n') for x in stocks_list]
    for row in stocks_lists:
        with open('output.csv', 'a', encoding='utf-8', newline='') as csv_file:
            csv_write = csv.writer(csv_file)
            csv_write.writerow(row)
    

    Full Code:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.chrome.service import Service
    import pandas as pd
    import requests
    import csv
      
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    
    driver = webdriver.Chrome('G://chromedriver.exe')
    
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
      "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    driver.execute_cdp_cmd("Network.enable", {})
    driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
    wait = WebDriverWait(driver, 30)
    driver.get("https://stockrover.com")
    wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div[1]/div/section[2]/div/ul/li[2]"))).click()
    user = driver.find_element(By.NAME, "username")
    password = driver.find_element(By.NAME, "password")
    user.clear()
    user.send_keys("********")
    password.clear()
    password.send_keys("********")
    driver.find_element(By.NAME, "Sign In").click()
    wait = WebDriverWait(driver, 30)
    
    
    
    stocks_list = []
    try:
        while True:
            # Print the stock symbols
            stocks_list.extend([my_elem.text for my_elem in WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table[id^='gridview-1072-record']")))])
            # Click on next page button
            wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="button-1157"]'))).click()
    except:
            print("Next button disabled")
    # print(stocks_list) # Prints entire list of stocks
    
    stocks_lists = [x.split('\n') for x in stocks_list]
    for row in stocks_lists:
        with open('output.csv', 'a', encoding='utf-8', newline='') as csv_file:
            csv_write = csv.writer(csv_file)
            csv_write.writerow(row)