【问题标题】:I want each individual drop down to be selected one by one and want all the data respectively我希望每个下拉列表都被一一选择,并分别想要所有数据
【发布时间】:2021-03-04 06:36:19
【问题描述】:

我正在尝试通过 python 语言抓取网站数据,该语言包括多个下拉列表 - 通过 selenium 进行静态和动态,但我希望每种商品都与每个州、每个地区、每个市场、日期价格和到货有关。我已经尝试为单一商品做这是我的代码,但我希望通过任何自动化代码或for 循环或while 循环提取所有数据并将所有数据转换为 CSV 格式 #帮帮我!

from selenium import webdriver
import pandas as pd
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from selenium.common.exceptions import NoSuchElementException
import time

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://agmarknet.gov.in/')

time.sleep(3)

obj0 = driver.find_element(By.XPATH,'//*[@id="ddlArrivalPrice"]/option[2]').click()
time.sleep(8)

obj1 = driver.find_element(By.XPATH,'//*[@id="ddlCommodity"]/option[2]').click()
time.sleep(10) 

obj2 = driver.find_element(By.XPATH,'//*[@id="ddlState"]/option[2]').click()
time.sleep(15)

obj3 = driver.find_element(By.XPATH,'//*[@id="ddlDistrict"]/option[2]').click()
time.sleep(15)

obj4 = driver.find_element(By.XPATH,'//*[@id="ddlMarket"]/option[2]').click()
time.sleep(8)

obj5 = driver.find_element(By.ID,'txtDate').click()
time.sleep(5)

obj6 = driver.find_element(By.XPATH,'//*[@id="CalendarExtender1_day_0_1"]').click()
time.sleep(6)

obj7 = driver.find_element(By.ID,'txtDateTo').click()
time.sleep(6)


obj8 = driver.find_element(By.XPATH,'//*[@id="CalendarExtender2_day_0_1"]').click()
time.sleep(6)

obj9 = driver.find_element(By.XPATH,'//*[@id="btnGo"]').click()
time.sleep(5)

obj10 = driver.find_element(By.XPATH,'//*[@id="cphBody_ButtonExcel"]').click()
time.sleep(6)

【问题讨论】:

  • 除非他们通过 Javascript 动态构建菜单,否则无论下拉菜单是否显示,所有下拉菜单选项都会出现在 HTML 中。
  • @Tim 是的,但我知道,但我希望每个数据分别先选择价格,然后选择商品,然后选择状态、地区、市场、日期和去,然后点击去我得到的数据想要每个下拉选项的那个

标签: python selenium selenium-webdriver xpath


【解决方案1】:

您可以像这样遍历选择器的每个选项:

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select


driver = webdriver.Chrome(executable_path='D:/chromedriver.exe')


driver.maximize_window()
driver.get('http://agmarknet.gov.in/')

def refind_element(locator,index):
    values = driver.find_element_by_id(locator).find_elements_by_tag_name("option")[index].text
    return values


time.sleep(6)
all_price_arrivals = driver.find_element_by_id("ddlArrivalPrice").find_elements_by_tag_name("option")
for i in range(0,len(all_price_arrivals)):
    selector_all_price_arrival = Select(driver.find_element_by_id('ddlArrivalPrice'))    
    selector_all_price_arrival.select_by_index(i)    
    time.sleep(3)
    all_commodity = driver.find_element_by_id("ddlCommodity").find_elements_by_tag_name("option")
    for j in range(1,(len(all_commodity))):
        selector_comodity = Select(driver.find_element_by_id('ddlCommodity'))    
        selector_comodity.select_by_index(j)    
        time.sleep(3)
        all_state_options = driver.find_element_by_id("ddlState").find_elements_by_tag_name("option")
        for k in range(1,(len(all_state_options))):
            selector_state = Select(driver.find_element_by_id('ddlState'))    
            selector_state.select_by_index(k)    
            time.sleep(3)
            all_district_options = driver.find_element_by_id("ddlDistrict").find_elements_by_tag_name("option")
            for l in range(1,(len(all_district_options))):
                selector_district = Select(driver.find_element_by_id('ddlDistrict'))
                selector_district.select_by_index(l)
                time.sleep(3)
                all_market_options = driver.find_element_by_id("ddlMarket").find_elements_by_tag_name("option")
                for m in range(1,(len(all_market_options))):
                    selector_market = Select(driver.find_element_by_id('ddlMarket'))
                    selector_market.select_by_index(m)
                    time.sleep(3)
                    print('Arrival/Price is: ' + refind_element('ddlArrivalPrice',i) + ', Commodity is: ' + refind_element('ddlCommodity',j) + ', State is: ' + refind_element('ddlState',k) + ', District is: ' + refind_element('ddlDistrict',l) + ', Market is: ' + refind_element('ddlMarket',m))
                    time.sleep(1)
                    #continue the test => select a date? and press go?
                
                

输出如下:

【讨论】:

  • 是的,那么应该自动选择日期。所以,我的意思是每 24 小时后脚本应该运行并选择新日期,然后在按下“GO”按钮后。表格将到达,我们必须获取并存储为“.csv”格式的表格,如“Column-明智的”。对于每个“Price-arrivals”、“Commodity”、“State”、“district”、“Market”都是如此。如果它显示的数据未找到,那么它将在行中打印“N.A”,同样过程应该继续。 @art_architect
  • 你能帮帮我吗! @艺术
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2021-02-24
  • 2021-12-30
相关资源
最近更新 更多