Продолжайте цикл после исключения NoElementException

#python #selenium

Вопрос:

Я просматриваю набор URL-адресов, извлекая данные из каждого. Открыв URL-адрес, я хочу очистить первые (5) результатов; однако некоторые из этих URL-адресов содержат менее пяти результатов, поэтому я хотел бы очистить до пяти, а затем перейти к следующему URL-адресу в моем списке.

То , как в настоящее время настроен мой сценарий, использует try: except: continue , как я понимаю, «продолжение» цикла с самого начала. Мое намерение состоит в том, чтобы перейти к следующему URL-адресу, как только NoSuchElementException будет выдан a (потому что я знаю, что на странице больше нет результатов).

Это результат, которого я надеюсь достичь — там, где «spaceref» имеет только два результата, затем сценарий запускается по следующему URL-адресу, «фредди мак», у которого пять результатов, останавливается, затем переходит к следующему URL-адресу:

 [{'Result 1': ('spaceref', '40', 'http://www.spaceref.com/mars/')},  {'Result 2': ('spaceref dot com', '20', 'http://www.spaceref.com/')}, {'Result 3': ('None')}, {'Result 4': ('None')}, {'Result 5': ('None')} , {'Result 1': ('freddie mac', '40K', 'http://www.freddiemac.com/')},  {'Result 2': ('freddie mac about', '1400', 'http://www.freddiemac.com/about')},  {'Result 3': ('freddie mac services', '1250', 'http://www.freddiemac.com/services')},  {'Result 4': ('freddie mac team', '1010', 'http://www.freddiemac.com/team')},  {'Result 5': ('freddie mac contact', '750', 'http://www.freddiemac.com/contact')} {'Result 1': ('lorem ipsum', 'n', 'http://www.example.com')} {'ETC...'}]  

Вот мой текущий сценарий: (Я знаю, что есть гораздо более эффективные способы написать это. Я тоже ненавижу это, но в этом случае необходимо находить отдельные элементы с помощью XPath)

Большое спасибо за любые советы!

 group_url = [ 'https://www.example1.com', 'https://www.example2.com', 'https://www.example3.com' ]  data = []  for group in group_url:  driver.get(group)  wait = WebDriverWait(driver, 90)  element = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="root"]/div/div[2])))  try:  kw1 = driver.find_element_by_xpath('//*[@id="root"]/div')  vol1 = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]')  url1 = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/main/')  data.append({  "Result 1": (kw1.text, vol1.text, url1.text)  })  except NoSuchElementException:  data.append({"Result 1": None})  continue  try:  kw2 = driver.find_element_by_xpath('//*[@id="root"]/div')  vol2 = driver.find_element_by_xpath('//*[@id="root"]/div/div[2]')  url2 = driver.find_element_by_xpath('//*[@id="root"]/div/div[2]/main/')  data.append({  "Result 2": (kw2.text, vol2.text, url2.text)  })  except NoSuchElementException:  data.append({"Result 2": None})  continue  try:  kw3 = driver.find_element_by_xpath('//*[@id="root"]/div')  vol3 = driver.find_element_by_xpath('//*[@id="root"]/div/div[3]')  url3 = driver.find_element_by_xpath('//*[@id="root"]/div/div[3]/main/')  data.append({  "Result 3": (kw3.text, vol3.text, url3.text)  })  except NoSuchElementException:  data.append({"Result 3": None})  continue  try:  kw4 = driver.find_element_by_xpath('//*[@id="root"]/div')  vol4 = driver.find_element_by_xpath('//*[@id="root"]/div/div[4]')  url4 = driver.find_element_by_xpath('//*[@id="root"]/div/div[4]/main/')  data.append({  "Result 4": (kw4.text, vol4.text, url4.text)  })  except NoSuchElementException:  data.append({"Result 4": None})  continue  try:  kw5 = driver.find_element_by_xpath('//*[@id="root"]/div')  vol5 = driver.find_element_by_xpath('//*[@id="root"]/div/div[5]')  url5 = driver.find_element_by_xpath('//*[@id="root"]/div/div[5]/main/')  data.append({  "Result 5": (kw5.text, vol5.text, url5.text)  })  except NoSuchElementException:  data.append({"Result 5": None})  continue driver.close() print(data)  

Это мой фактический вывод. каждый URL-адрес, похоже, неправильно проходит через цикл. Например, я знаю, что у spaceref есть (2) результата, поэтому я знаю, что он не дает мне второго результата. Я также знаю, что у Фредди Мака есть (5) результатов, которые также не выводятся. А для остальных URL-адресов в моем списке вывод возвращает только «Результат 1″: Нет».:

 [{'Result 1': ('spaceref', '40', 'http://www.spaceref.com/mars/')},  {'Result 2': None},  {'Result 1': None}, {'Result 1': None},  {'Result 1': None},  {'Result 1': None},  {'Result 1': None}]  

Комментарии:

1. Вы описали, каково желаемое поведение, но в чем проблема, какое неправильное поведение у вас в настоящее время с вашим кодом?

2. Спасибо, @Prophet. Пожалуйста, ознакомьтесь с изменениями.