Python: Selenium: как написать попытку - кроме кода для повторной попытки итерации - PullRequest
2 голосов
/ 07 апреля 2019

У меня есть веб-скребок, которым я довольно доволен, за исключением того, что иногда он пропускает итерации, потому что он не загружает веб-страницу полностью (это характер веб-сайта, который я копирую. В этих случаях я желаюкод, чтобы повторить итерацию. На данный момент структура моего кода выглядит примерно так:

data = []
for i in range(len(links)):
    try:
        driver.get(link[i])
        a = driver.find_elements_by_xpath(#data in here)[0].text
        data.append(a)
        #this is then written to a csv
    except:
        print(i)

Итак, на данный момент мой код запускается, а затем просто перечисляет мне, какие экземпляры числа не удалось. Язатем вернитесь назад и вручную введите данные. Для меня было бы намного приятнее, если бы вместо этого моя программа снова попыталась выполнить сбойный экземпляр, чтобы я не пропустил данные. В любом случае, как это можно сделать? Спасибо

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

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

data = []
intData = []
counter = 0
maxIterations = 2

def Diff(li1, li2): 
    return (list(set(li1) - set(li2)))

while counter < maxIterations:
     for i in range(len(links)):
        try:
            if counter < 1:    
                driver.get(link[i])
                a = driver.find_elements_by_xpath(#xpathstring)[0].text
                data.append(a)
            else:
                driver.get(link[i])
                a = driver.find_elements_by_xpath(#xpathstring)[0].text
                intData.append(a)

            counter += 1
        except:
            print(i)
            counter += 1

# Find differences between first iterations and all consecutive ones
print(Diff(intData, data))
0 голосов
/ 08 апреля 2019

Если вы хотите повторить один и тот же link[i] несколько раз, вам, вероятно, понадобится дополнительный цикл.Какой именно цикл зависит от некоторых деталей.Если вы хотите продолжать попытки, пока не добьетесь успеха (при условии, что вы можете быть уверены, что это в конечном итоге произойдет), тогда цикл while True будет наиболее целесообразным.С другой стороны, если вы хотите ограничить количество попыток, цикл for в диапазоне будет лучше.

Вот эскиз реализации, которая пытается до трех раз:

max_tries = 3

data = []
for i, link in enumerate(links):   # this is a slightly nicer way to do your main loop
    for t in range(max_tries):
        try:
            driver.get(link)
            a = driver.find_elements_by_xpath("#data in here")[0].text
            data.append(a)
            break                  # break out of the inner loop if we succeeded
        except:
            print("failed to load link", i, "retrying..." if t < max_tries-1 else "giving up.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...