2017-07-04 105 views
1

我張貼由於無法將它張貼問題,同樣的問題,妥善我又發佈我的問題,我已創建使用硒網站https://maharerait.mahaonline.gov.in/searchlist/searchlist硒網絡驅動刮板

刮刀每當我運行這個它通過每下拉,當它發現在CSV被刮有用的數據它提供了一定的誤差:

Traceback (most recent call last): 
File "C:\Users\prince.bhatia\Desktop\maharera\Maha_Rera.py", line 66, in 
<module> 
    selectVillage.select_by_index(villageElement) 
    File 
"C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site- 
packages\selenium\webdriver\support\select.py", line 103, in select_by_index 
raise NoSuchElementException("Could not locate element with index %d" % 
index) 
selenium.common.exceptions.NoSuchElementException: Message: Could not locate 
element with index 33 

下面是我的代碼:

from selenium import webdriver 
from selenium.webdriver.support.ui import Select 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 


import os 
import time 
import csv 
import sys 

driver = webdriver.Chrome("./chromedriver") 

driver.get('https://maharerait.mahaonline.gov.in/searchlist/searchlist') 

# try: 
#  element = WebDriverWait(driver, 100).until(
#   EC.presence_of_element_located((By.ID, "Promoter")) 
# ) 
# finally: 
#  print('0000000000000000000000') 
#  driver.quit() 

time.sleep(1) 

driver.find_element_by_id('Promoter').click() 

divisionLength = len(Select(driver.find_element_by_id('Division')).options) 
print('*********{}'.format(divisionLength)) 

firstRow = 0 
titleRow = [] 
contentRows = [] 

    for divisionElement in range(1,divisionLength): 
    selectDivision = Select(driver.find_element_by_id('Division')) 
    selectDivision.options 
selectDivision.select_by_index(divisionElement) 
time.sleep(1) 
districtLength = len(Select(driver.find_element_by_id('District')).options) 
while districtLength == 1: 
    pass 
print(districtLength) 
for districtElement in range(1,districtLength): 
    selectDistrict = Select(driver.find_element_by_id('District')) 
    selectDistrict.options 

    selectDistrict.select_by_index(districtElement) 

    time.sleep(1) 

    talukaLength = len(Select(driver.find_element_by_id('Taluka')).options) 
    print('/-----taluka numbers: {}-------/'.format(talukaLength)) 
    for talukaElement in range(1, talukaLength): 
     selectTaluka = Select(driver.find_element_by_id('Taluka')) 
     selectTaluka.options 
     selectTaluka.select_by_index(talukaElement) 
     time.sleep(1) 

     villageLength = len(Select(driver.find_element_by_id('Village')).options) 
     print('/-----village numbers: {}-------/'.format(talukaLength)) 
     for villageElement in range(1, villageLength): 
      selectVillage = Select(driver.find_element_by_id('Village')) 
      selectVillage.options 
      selectVillage.select_by_index(villageElement) 
      time.sleep(2) 
      projectLength = len(Select(driver.find_element_by_id('Project')).options) 

      print('/------------------------------/') 
      print('/-----project number: {}-------/'.format(projectLength)) 
      print('/------------------------------/') 
      if projectLength == 1: 
       continue 

      for projectElement in range(1,projectLength): 
       selectProject = Select(driver.find_element_by_id('Project')) 
       selectProject.options 

       while len(selectProject.options) == 1: 
        pass 
       # c = len(select.options) 
       # print('---------------{}'.format(c)) 

       # titleRow = [] 
       # contentRows = [] 
       # firstRow = 0 

       # for i in range(1,c): 
       #  select = Select(driver.find_element_by_id('Project')) 
       #  while len(select.options) == 1: 
       #   pass 
       time.sleep(1) 
       selectProject.select_by_index(projectElement) 

       driver.find_element_by_id('btnSearch').click() 
       tableRows = driver.find_element_by_class_name('table').find_elements_by_tag_name('tr') 

       if firstRow == 0: 
        headRow = tableRows[0].find_elements_by_tag_name('th') 
        for headRowData in range(0,len(headRow)): 
         text = headRow[headRowData].find_element_by_tag_name('span').text 
         titleRow.append(text) 
        firstRow = firstRow + 1 

       for dataRowsNumbers in range(1,len(tableRows)): 
        dataRow = tableRows[dataRowsNumbers].find_elements_by_tag_name('td') 
        tempList = [] 
        for dataRowContents in range(0,len(dataRow)): 
         try: 
          a_link = dataRow[dataRowContents].find_element_by_tag_name('a').get_attribute('href') 
          tempList.append(str(a_link)) 
         except: 
          tempList.append(str(dataRow[dataRowContents].text)) 
         # if dataRow[dataRowContents].text == 'View': 
         #  a_link = dataRow[dataRowContents].find_element_by_tag_name('a').get_attribute('href') 
         #  tempList.append(str(a_link)) 
         # else: 
         #  tempList.append(str(dataRow[dataRowContents].text)) 
         print(dataRow[dataRowContents].text) 
        print(tempList) 
        contentRows.append(tempList) 
# print('Automated check is over') 
# print('Stored data in programs is as below:') 
# print(contentRows) 
if sys.version_info[0] <= 2: 
    with open("./data.csv",'w') as csvfile: 
    csvfile = csv.writer(csvfile, delimiter=',') 
    csvfile.writerow(titleRow) 
    csvfile.writerow("") 
    for i in range(0,len(contentRows)): 
     csvfile.writerow(contentRows[i]) 
else: 
    with open("./data.csv",'w',newline='') as csvfile: 
     csvfile = csv.writer(csvfile, delimiter=',') 
     csvfile.writerow(titleRow) 
     csvfile.writerow("") 
     for i in range(0,len(contentRows)): 
     csvfile.writerow(contentRows[i]) 
driver.close() 

我如果有人可以請說,我在哪裏做錯了?我正在使用python 3.6 我已經關閉了上一個問題 我不得不在這裏給4個空格,但是除了錯誤之外,原文是很好寫的。

回答

1

你的錯誤就行彈出:

selectVillage.select_by_index(villageElement) 

按照documentation

This is done by examining the "index" attribute of an element, and not merely by counting.

因此,你需要改變的代碼通過內容本身進行迭代,而該range(1,projectLength)

更新:

this,解決方案可能是因爲你開始從範圍0而不是1那樣簡單:

for villageElement in range(0, villageLength - 1): 

注:如果一切正常,那麼你就需要改變其他循環相應地。

+0

有沒有更多的幫助,我可以期待?如果你能幫我修改那段代碼,因爲我完全困惑 –

+0

非常感謝你SIR –