私は変数のパラメータのさまざまな組み合わせを繰り返し、セルサイトからデータをダウンロードするためにセレニウムを使用しています。ただし、データがない場合は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()
しかし、このコードは単に継続で機能を停止し、ループの残りをダウンロードコードの部分と、繰り返し処理を完了していません。どのようにこれを解決するための任意のアイデア?また、質問が混乱している場合は、私にお知らせください。
コード内のコメントの意図が不明なため、検証可能な最小限の例が必要です。 – snb
さらに、continueステートメントの後にコードを記述し、ループが "続行"するとcontinueステートメントの後に実行されることはないので、ループの残りの部分をスキップするよう設計されているため、継続が発生した後にデータがダウンロードされることを期待していることを暗示します。これは意味をなさないものです。 – snb
もちろん、私は編集を行います。あなたの2番目のコメントについて、そのコメントは正確に言っています:特定のテキストが見つかった場合は、次の繰り返しに進みます。それ以外の場合は、残りのループを継続してデータをダウンロードします。 – user2105555