Пока Python пишет в CSV, скрипт вставляет новую строку в блок try / Кроме в файле CSV - PullRequest
0 голосов
/ 26 ноября 2018

Добрый день,

Я довольно плохо знаком с Python и Selenium, и мне нужна помощь по следующей проблеме:

Фрагмент моего кода выглядит следующим образом:

num_page_items = len(date)
blank = "0"
try:
    with open('results.csv', 'a') as f:
        for i in range(num_page_items):
            f.write(name[i].text + "#" + surname[i].text + "#" + ref[i].text + "#" + url[i].text + "\n")
except IndexError:
    with open('results.csv', 'a') as f:
            f.write(blank)

У меня есть несколько переменных, которые очищают сайт с помощью селена.Пример данных и ожидаемый результат следующие:

Имя: Джо Фамилия: Ссылка на мыло: 1234 URL: www.example.com

Имя: Билл Фамилия: Смит Ссылка:4567 URL: www.dot.com

ожидаемый результат

, когда присутствуют все элементы, скрипт Python работает хорошо, однако при наличии одного элемента (в примере: Ref не существует во второй записи) не существует, вывод выглядит следующим образом

вывод, когда элемент не существует

что я могу сделатьустановить переменную в «Null», если переменная не существует на веб-странице, поэтому ожидаемый новый вывод будет следующим:

ожидаемый вывод, когда элемент не существует

Так же, как примечание, ошибка, которую я получаю, не является исключением Selenium, но является IndexError, поэтому используется выражение "IndexError" кроме оператора

РЕДАКТИРОВАТЬ - Предложение Фелипе Гутьерреса

большой фрагмент кода с Фелипе 'Предложение s:

for url in links:
        driver.get(url) #goes to the array and opens each link

        company = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[2]/ul/li/div/div[1]/span""") 
        date = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[1]/div[2]/div/span""")
        ref = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[3]""")
        title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
        urlinf = driver.current_url

        num_page_items = len(date)
        blank = "blank"

        for ref in ref:
            if ref is None:
                ref = 0

        with open('results.csv', 'a') as f:
            for i in range(num_page_items):
                f.write(company[i].text + "#" + date[i].text + "#" + ref[i].text + "#" + title[i].text + "#" + urlinf + "\n")

driver.close()

Теперь я получаю следующую ошибку:

Traceback (последний вызов был последним): файл "accc_for_loop_nest.py", строка 50, в файле f.write(company [i] .text + "#" + date [i] .text + "#" + ref [i] .text + "#" + title [i] .text + "#" + urlinf + "\ n") TypeError: объект 'WebElement' не поддерживает индексирование

1 Ответ

0 голосов
/ 26 ноября 2018

Вы теряете индекс списков, по которым вы итерируете, с помощью try-catch, вы можете попробовать проверить значения IndexError перед циклом вставки и назначить ноль списку в этом конкретном месте.Чем сделать вставку без обработки исключений.Что-то вроде:

for url in links:
    driver.get(url) #goes to the array and opens each link

    company = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[2]/ul/li/div/div[1]/span""") 
    date = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[1]/div[2]/div/span""")
    ref = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[3]""")
    title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
    urlinf = driver.current_url

    num_page_items = len(date)
    blank = "blank"

    companyStrings = []
    dateStrings = []
    refStrings = []
    titleStrings = []

    with open('results.csv', 'a') as f:
            for i in range(num_page_items):
                companyStrings.append( company[i].text )
                dateStrings.append( date[i].text )
                refStrings.append( ref[i].text )
                titleStrings.append( title[i].text ) 
                if companyStrings[i] == '':
                    companyStrings[i] = '0'
                if dateStrings[i] = '':
                    dateStrings[i] = '0'
                if refStrings[i] == '':
                    refStrings[i] = '0'
                if titleStrings[i] == '':
                    titleStrings[i] = '0'
                f.write(companyStrings[i] + "#" + dateStrings[i] + "#" + refStrings[i] + "#" + titleStrings[i] + "#" + urlinf + "\n")

driver.close()
...