2017-09-18 11 views
0

私は変数のパラメータのさまざまな組み合わせを繰り返し、セルサイトからデータをダウンロードするためにセレニウムを使用しています。ただし、データがない場合はforループ関数の動作が停止します。セレンがウェブページに「結果を生成できません」と書かれたテキストを含むことを止めると気付きます。したがって、私はifステートメントを使用して "結果を生成できません"を検索し、前述のテキストが見つかった場合は次のループに進みます。例では、このようなものになるだろう:Python - forループif文Seleniumで次の繰り返しにスキップ

import os 
from selenium import webdriver 
import zipfile 
import pandas as pd 
import time 

for i in to_loop: 
    # directories 
    link = 'http://www.gaez.iiasa.ac.at/w/ctrl? 
_flow=Vwr&_view=Welcome&idAS=0&idFS=0&fieldmain=main_&idPS=0' 

    ## Access Chrome Driver to use selenium 
    # Define Download Directory 
    chrome_options = webdriver.ChromeOptions() 
    prefs = {'download.default_directory': 'C:/.../Download'} 
    chrome_options.add_experimental_option('prefs', prefs) 
    driver = webdriver.Chrome(
     executable_path='C:/.../chromedriver.exe', 
     chrome_options=chrome_options) 
    driver.get(link) 

    # Enter username and password 
    driver.find_element_by_name('_username').send_keys(username) 
    driver.find_element_by_name('_password').send_keys(password) 
    driver.find_element_by_id('buttonSubmit__login').click() 

    # Click on Suitability and Potential Yield link 
    driver.find_element_by_name('_targetfieldmain=main_py&_...').click() 

    # Click on Agro-ecological suitability and productivity link 
    driver.find_element_by_name('&fieldmain=main_py&idPS=0&...').click() 
    # Click on Agro-ecological suitability and productivity list 
    driver.find_element_by_css_selector('input[value=" 
{}"]'.format(i[0])).click() 
    # Click on crop link 
    driver.find_element_by_css_selector("input.linksubmit[value=\"▸ 
Crop\"]").click() 
    AES_and_P = i[0] 

    driver.find_element_by_css_selector('input[value=" 
{}"]'.format(i[1])).click() 
    # Click on Water Supply Link 
    driver.find_element_by_css_selector("input.linksubmit[value=\"▸ Water 
Supply\"]").click() 
    Crop = i[1] 

    driver.find_element_by_css_selector('input[value=" 
{}"]'.format(i[2])).click() 
    # Click on Input Level Link 
    driver.find_element_by_css_selector("input.linksubmit[value=\"▸ Input 
Level\"]").click() 
    Water_Supply = i[2] 

    driver.find_element_by_css_selector('input[value=" 
{}"]'.format(i[3])).click() 
    Input_Level = i[3] 

    # If statement to skip to next loop if text found 
    data_check = driver.find_elements_by_partial_link_text('Cannot produce 
results.') 
    if data_check[0].is_displayed(): 
     continue 

    # Click on Time Period and Select Baseline 
    driver.find_element_by_css_selector("input.linksubmit[value=\"▸ Time 
Period\"]").click() 
    driver.find_element_by_css_selector("input.linksubmit[value=\"1961- 
1990\"]").click() 
    # Click on Geographic Areas Link 
    driver.find_element_by_css_selector("input.linksubmit[value=\"▸ 
Geographic Areas\"]").click() 
    # Unselect all countries 
    driver.find_element_by_xpath('//*[@id="fieldareaList__pln-1"]').click() 
    # Close tab for Northern Africa 
    driver.find_element_by_xpath('//*[@id="rg1-66-Northern 
Africa"]/span').click() 
    # Wait 1 second 
    time.sleep(1) 
    # Click geographic area then country 
    driver.find_element_by_xpath('//label[text()="{}"]/following- 
sibling::span'.format(geographic_area)).click() 
    driver.find_element_by_xpath('//label[text()=" 
{}"]'.format(country)).click() 
    # Click on Map Link 
    driver.find_element_by_css_selector("input.linksubmit[value=\"▸ 
Map\"]").click() 
    # Download Data 
    driver.find_element_by_xpath('//*[@id="buttons"]/a[4]/img').click() 

    # Wait 2 seconds 
    time.sleep(2) 

    # Download blah blah 
    path = 'C:/.../Download' 
    destination_folder = 'C:/.../CSV_Files' 
    file_list = [os.path.join(path, f) for f in os.listdir(path)] 
    time_sorted_list = sorted(file_list, key=os.path.getmtime) 
    file_name = time_sorted_list[-1] 
    # decompress the zipped file here 
    myzip = zipfile.ZipFile(file_name) 

    # Wait 1 second 
    time.sleep(1) 

    myzip.extract('data.asc', destination_folder) 

    # Save data.asc file as .csv and rename reflects download selections 
    newfilename = country + Crop + Water_Supply + Input_Level + AES_and_P 
    df = pd.read_table(os.path.join(destination_folder, 'data.asc'), 
sep="\s+", skiprows=6, header=None) 
    df.to_csv(os.path.join(destination_folder, '{}.csv'.format(newfilename))) 

    # Delete downloaded data.asc file 
    delete_data_file = "C:/.../CSV_Files/data.asc" 
    # if file exists, delete it 
    if os.path.isfile(delete_data_file): 
     os.remove(delete_data_file) 
    else: # Show error 
     print("Error: %s file not found" % delete_data_file) 

    driver.close() 

しかし、このコードは単に継続で機能を停止し、ループの残りをダウンロードコードの部分と、繰り返し処理を完了していません。どのようにこれを解決するための任意のアイデア?また、質問が混乱している場合は、私にお知らせください。

+0

コード内のコメントの意図が不明なため、検証可能な最小限の例が必要です。 – snb

+2

さらに、continueステートメントの後にコードを記述し、ループが "続行"するとcontinueステートメントの後に実行されることはないので、ループの残りの部分をスキップするよう設計されているため、継続が発生した後にデータがダウンロードされることを期待していることを暗示します。これは意味をなさないものです。 – snb

+0

もちろん、私は編集を行います。あなたの2番目のコメントについて、そのコメントは正確に言っています:特定のテキストが見つかった場合は、次の繰り返しに進みます。それ以外の場合は、残りのループを継続してデータをダウンロードします。 – user2105555

答えて

1

コメントの中で議論した後、私はあなたの問題の少なくとも一部を見ていると思います。 python continue keywordは、「制御フローの残りの部分を継続する」という意味ではなく、「ループの次の繰り返しを続行し、すべてをスキップする」ことを意味します。

例えば、Pythonの次のコードで:

a = [] 
for i in range(10): 
    if i == 5: 
     continue 
    a.append(i) 

print(a) 

結果は次のようになります。

[0, 1, 2, 3, 4, 6, 7, 8, 9] 

そしてない、にこのように以前のロジック

[5] 

を使用して継続してコードを修正する場合は、条件が真でない場合はスキップするようにロジックを反転する必要があります。たとえば、

if not data_check[0].is_displayed(): 
    continue 

私はあなたが、私は確かに「継続」の次の部分での継続を参照することをより多くの意味を作るように見えるんとして意味的に強調すると同じエラーをしていた誰かに遭遇していない個人的に決してきたもののプログラム。 continueのPythonsの選択は、というキーワードとして、歴史的な使用法continueから大部分を取ります。この場合、breakステートメントの「スキップ」への拡張の多くとして、continueが表示されます。

+0

解決策をお寄せいただきありがとうございます。 – user2105555

関連する問題