2017-12-15 23 views
0

以下は、私がBSE Webサイトをスクレイプするために使用するコードです。細かいことを除いて、すべて正常に動作します。内側(2番目)のforループは反復せず、実行は終了します。 助けが役に立ちます。Python Selenium inner forループは反復しません

browser=webdriver.Chrome() 
browser.get('http://www.bseindia.com/markets/keystatics/Keystat_index.aspx') 
for i in range(1,48): 
    browser.find_element_by_xpath("//*[@id='ctl00_ContentPlaceHolder1_ddltype']/option["+str(i)+"]").click() 
    browser.find_element_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_btnSubmit"]').click() 
    data = [] 
    for j in range(2,21): 
     browser.find_element_by_xpath("//*[@id='ctl00_ContentPlaceHolder1_gvReport_ctl"+str(j).zfill(2)+"_Linkbtn']").click() 
     for tr in browser.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_gvYearwise"]'): 
      ths = tr.find_elements_by_tag_name('th') 
      tds = tr.find_elements_by_tag_name('td') 
      if ths: 
       data.append([th.text for th in ths]) 
      if tds: 
       data.append([td.text for td in tds]) 
      f.write(str(data) + "\n") 
+1

たぶん 'browser.find_elements_by_xpath( '// * [ID @ = "ctl00_ContentPlaceHolder1_gvYearwiseは"]')'空のリストを返しますか? – suit

+0

@suit no、結果として最初の反復リストを取得しています。 – Ted

+0

は 'ctl00_ContentPlaceHolder1_gvReport'あなたが掻きたいテーブルですか? – skrubber

答えて

3

何度500にリード線をクリックしますので、私は、再帰的にtry catchブロックを実行しました。ここで

が全体のコードです:

from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException 
import time 

base_url="http://www.bseindia.com/markets/keystatics/Keystat_index.aspx" 
#browser = webdriver.Chrome('/Users/qriyoinfolabs/ahlat/chromedriver') 
browser=webdriver.Chrome() 
browser.get(base_url) 
data = [] 


def fetch_this_erroful_page_for_me(id): 
    try: 
     print "Trying "+str(id)+"..." 
     browser.find_element_by_xpath("//*[@id='ctl00_ContentPlaceHolder1_ddltype']/option["+str(id)+"]").click() 
     browser.find_element_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_btnSubmit"]').click() 
    except: 
     print "Retrying "+str(id)+"..." 
     time.sleep(2) 
     browser.get(base_url) 
     fetch_this_erroful_page_for_me(id) 

def click_on_this_link_for_me(year_id,option_id): 
    try: 
     print "Trying year"+str(year_id)+"..." 
     zfilled_id=str(year_id).zfill(2) 
     browser.find_element_by_xpath("//*[@id='ctl00_ContentPlaceHolder1_gvReport_ctl"+zfilled_id+"_Linkbtn']").click() 
     return 1 
    except NoSuchElementException: 
     return 0 
    else: 
     time.sleep(2) 
     fetch_this_erroful_page_for_me(option_id) 
     click_on_this_link_for_me(year_id,option_id) 

for i in range(1,48): 
    fetch_this_erroful_page_for_me(i) 

    for j in range(2,21): 

     valid=click_on_this_link_for_me(j,i) 
     if(valid==0): 
      print "valid0" 
      break 
     for tr in browser.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_gvYearwise"]'): 
      ths = tr.find_elements_by_tag_name('th') 
      tds = tr.find_elements_by_tag_name('td') 
      if ths: 
       data.append([th.text for th in ths]) 
      if tds: 
       data.append([td.text for td in tds]) 


with open('str.txt','w') as file: 
    file.write(str(data)) 
0

'//[@id="ctl00_ContentPlaceHolder1_gvYearwise"]'これはtableで、trタグではありません。したがって、browser.find_elements_by_xpath(..)はただ1つの要素を返します。 試して'//[@id="ctl00_ContentPlaceHolder1_gvYearwise"]//tr'

Btw、これはfor i in range(1,48)のようにするのが本当に悪い習慣です。要素や要素ジェネレータで反復可能なオブジェクトを作成しようとします。例えば

(それを適切にテストしていないので、私は、うまく機能なしSHURE午前 - HTTP ERROR 500問題があります):

def get_next_row(driver, xpath): 
    i = 0 
    while True: 
     try: 
      yield driver.find_elements_by_xpath(xpath)[i] 
     except IndexError: 
      break 
     i += 1 

browser=webdriver.Chrome() 
browser.implicitly_wait(0.5) 
browser.get('http://www.bseindia.com/markets/keystatics/Keystat_index.aspx') 

for list_item in get_next_row(browser, "//*[@id='ctl00_ContentPlaceHolder1_ddltype']/option"): 
    list_item.click() 
    browser.find_element_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_btnSubmit"]').click() 
    data = [] 
    for next_button in get_next_row(browser, '//a[contains(@id, "ctl00_ContentPlaceHolder1_gvReport_ct")]'): 
     next_button.click() 
     for tr in get_next_row(browser, '//*[@id="ctl00_ContentPlaceHolder1_gvYearwise"]//tr'): 
      ths = tr.find_elements_by_tag_name('th') 
      tds = tr.find_elements_by_tag_name('td') 
      if ths: 
       data.append([th.text for th in ths]) 
      if tds: 
       data.append([td.text for td in tds]) 
      f.write(str(data) + "\n") 
関連する問題