Попытка перезапустить итерацию цикла с самого начала, как только условие завершит первую итерацию цикла - PullRequest
1 голос
/ 16 июня 2019

У меня есть 2 вложенных цикла «for», я пытаюсь перезапустить первый цикл для повторения с начала, как только его вложенный цикл успешно завершит свои итерации согласно оператору if.Однако, если вложенный цикл удовлетворяет условию else, внешний цикл должен регулярно продолжать итерации.Я пытаюсь сказать коду, что если найденный в тексте keys_on_screen начинается с ключевого слова, созданного до этой точки, чтобы продолжить, в противном случае, чтобы изменить его в последнем индексе, где они перестали соответствовать.

Это то, что у меня естьуже пробовал, но первый (внешний) цикл продолжает перебирать буквы, а не перезапускаться с начала.

import time
from bs4 import BeautifulSoup
from selenium import webdriver
browser = webdriver.Chrome('chromedriver.exe')
keyList = ['a','b','c','d']
mainUrl = "https://www.amazon.com/"
browser.get(mainUrl)
searchInput = browser.find_element_by_xpath('//input[@id="twotabsearchtextbox"]')
searchInput.clear()
keyword = str()

# I WANT THE LOOP TO RESTART FROM HERE ONCE THE NESTED LOOP IS FINISHED

for keyChar in keyList:
    searchInput.send_keys(keyChar)
    time.sleep(2)
    searchSoup = BeautifulSoup(browser.page_source, "html.parser")
    searchResult = searchSoup.find_all('div', attrs={'id':'suggestions-template'})
    results = searchResult[0].find_all('div', attrs={'class':'s-suggestion'})
    keyword = keyword + keyChar
    print("This is the keyword so far:>>>>   ",keyword)
    time.sleep(2)

    for data_result in results:
        data_keywords = BeautifulSoup(str(data_result),"html.parser")
        keywords_on_screen = data_keywords.find("div", class_="s-suggestion")["data-keyword"]
        print(keywords_on_screen)

        if keywords_on_screen.startswith(keyword):
            print('ALL GOOD')
        else:
            print('Condition not met, moving on next letter')
            continue

1 Ответ

1 голос
/ 16 июня 2019

Я полагаю, что вы хотите продолжить самый внешний цикл, если выполняется условие else во вложенном цикле. И если условие else не выполняется, перезапустите самый внешний цикл с самого начала.

TRY: -

import time
from bs4 import BeautifulSoup
from selenium import webdriver
browser = webdriver.Chrome('chromedriver.exe')
keyList = ['a','b','c','d']
mainUrl = "https://www.amazon.com/"
browser.get(mainUrl)
searchInput = browser.find_element_by_xpath('//input[@id="twotabsearchtextbox"]')
searchInput.clear()
keyword = str()
ctr = 0
x = 0

# I WANT THE LOOP TO RESTART FROM HERE ONCE THE NESTED LOOP IS FINISHED

while x < len(keyList):
    keyChar = keyList[x]
    searchInput.send_keys(keyChar)
    time.sleep(2)
    searchSoup = BeautifulSoup(browser.page_source, "html.parser")
    searchResult = searchSoup.find_all('div', attrs={'id':'suggestions-template'})
    results = searchResult[0].find_all('div', attrs={'class':'s-suggestion'})
    keyword = keyword + keyChar
    print("This is the keyword so far:>>>>   ",keyword)
    time.sleep(2)

    for data_result in results:
        data_keywords = BeautifulSoup(str(data_result),"html.parser")
        keywords_on_screen = data_keywords.find("div", class_="s-suggestion")["data-keyword"]
        print(keywords_on_screen)

        if keywords_on_screen.startswith(keyword):
            print('ALL GOOD')
            ctr = 1
        else:
            print('Condition not met, moving on next letter')
            ctr = 0
            continue
    if ctr is not 1:
        x += 1

Самый внешний цикл будет выполняться бесконечно до тех пор, пока не будет выполнено вложенное условие if, в противном случае, если условие не будет выполнено, то самый внешний цикл будет выполняться нормально и завершится, как только все элементы списка KeyList будут исчерпаны.

...