Я не могу экспортировать вывод Python в файл Excel - PullRequest
0 голосов
/ 27 мая 2020

Я написал следующий код и не могу экспортировать данные в таблицу Excel.

from selenium import webdriver 
import time, re
from selenium.webdriver.support.ui import Select
from bs4 import BeautifulSoup
import pandas as pd 

chrome_path = r"C:\Users\user\Desktop\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

driver.get("http://agmarknet.gov.in/PriceTrends/SA_Pri_Month.aspx")

html_source = driver.page_source


for x in range(1,6): #loop for 5 months
    print (x)
    element_commodity = driver.find_element_by_id ("cphBody_Commodity_list")
    drp_commodity = Select(element_commodity)
    drp_commodity.select_by_visible_text("Wheat")

    time.sleep(15)

    element_year = driver.find_element_by_id ("cphBody_Year_list")
    drp_year = Select(element_year)

    drp_year.select_by_visible_text("2020")

    time.sleep(15)

    element_month = driver.find_element_by_id ("cphBody_Month_list")
    drp_month = Select(element_month)

   drp_month.select_by_index(x)
   time.sleep(15)

    driver.find_element_by_xpath("""//*[@id="cphBody_But_Submit"]""").click()
    time.sleep(15)

    soup = BeautifulSoup(driver.page_source, 'html.parser')
    table = pd.read_html(driver.page_source)[3] #third table is the one that we want
    print(len(table))
    print(table)

    table.to_excel(r'C:\Users\user\Desktop\python.xlsx', sheet_name = 'x')

И вот результат, который я получаю:

   1
   18
             0  ...                             5
   0            State  ...  % Change(Over Previous Year)
   1            Assam  ...                            __
   2      Chattisgarh  ...                        -36.87
   3          Gujarat  ...                          6.73
   4          Haryana  ...                            __
   5        Jharkhand  ...                            __
   6        Karnataka  ...                         -1.82
   7           Kerala  ...                         11.27
   8   Madhya Pradesh  ...                          7.46
   9      Maharashtra  ...                          1.46
   10    NCT of Delhi  ...                          5.05
   11          Odisha  ...                            __
   12          Punjab  ...                            __
   13       Rajasthan  ...                          8.12
   14   Uttar Pradesh  ...                           8.5
   15      Uttrakhand  ...                          2.83
   16     West Bengal  ...                          5.69
   17         Average  ...                           NaN

   [18 rows x 6 columns]
  2
  Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\agmarknet soup table extraction 
  trial.py", line 17, in <module>
element_commodity = driver.find_element_by_id ("cphBody_Commodity_list")
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 360, in find_element_by_id
return self.find_element(by=By.ID, value=id_)
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site- 
packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site- 
packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site- 
packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate 
element: {"method":"css selector","selector":"[id="cphBody_Commodity_list"]"}
(Session info: chrome=83.0.4103.61)

Идея заключалась в том, чтобы создать файл Excel с 5 листами, соответствующими выходным данным за 5 месяцев в раскрывающемся меню. . Я не могу понять, почему команда .to_excel не работает. Заранее благодарю за вашу помощь.

1 Ответ

1 голос
/ 27 мая 2020

Несколько проблем:

  1. С каждым l oop веб-страница генерирует результаты, но первоначальной панели критериев поиска больше нет, следовательно, NoSuchElementException вы видите. Быстрое решение этой проблемы - добавить driver.back() в качестве последнего действия внутри l oop.
  2. Способ записи фреймов данных на несколько листов Excel немного сложнее, чем этот.

Я внес некоторые изменения в ваш сценарий для решения этих проблем. Лог c предназначен для хранения всех собранных таблиц в списке results, а затем запись этого списка в Excel, каждая таблица на отдельном листе.

results=[]
for x in range(1,6): #loop for 5 months
    print (x)
    element_commodity = driver.find_element_by_id ("cphBody_Commodity_list")
    drp_commodity = Select(element_commodity)
    drp_commodity.select_by_visible_text("Wheat")

    time.sleep(10)

    element_year = driver.find_element_by_id ("cphBody_Year_list")
    drp_year = Select(element_year)

    drp_year.select_by_visible_text("2020")

    time.sleep(10)

    element_month = driver.find_element_by_id ("cphBody_Month_list")
    drp_month = Select(element_month)

    drp_month.select_by_index(x)
    time.sleep(10)

    driver.find_element_by_xpath("""//*[@id="cphBody_But_Submit"]""").click()
    time.sleep(10)

    soup = BeautifulSoup(driver.page_source, 'html.parser')
    table = pd.read_html(driver.page_source)[3] #third table is the one that we want
    print(len(table))
    print(table)

    results.append(table)

    driver.back()
    time.sleep(1)

with pd.ExcelWriter(r'eexport_sheets.xlsx') as writer:
    for i, table in enumerate(results):
        table.to_excel(writer, sheet_name = f'{i+1}', index=False)
    writer.save()

Вывод Excel: enter image description here

Общее примечание - рассмотрите возможность использования WebdriverWait вместо time.sleep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...