#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. Пожалуйста, ознакомьтесь с изменениями.