Соскребание с Python и Selenium - как мне вернуть «ноль», если элемент отсутствует - PullRequest
0 голосов
/ 22 ноября 2018

Добрый день, я новичок в Python и Selenium и уже некоторое время ищу решение.Хотя некоторые ответы близки, я не могу найти тот, который решает мою проблему.Небольшой фрагмент кода, который представляет собой небольшую проблему, выглядит следующим образом:

for url in links:
        driver.get(url)
        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""")
        title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
        urlinf = driver.current_url #url info

        num_page_items = len(date)

        for i in range(num_page_items):
            df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf[i]}, ignore_index=True)

Хотя это работает, если присутствуют все элементы (и я могу видеть выходные данные в кадре данных Pandas), если один из элементов не't существует (' date 'или' title ') Python отправляет сообщение об ошибке:

IndexError: список индекса выходит за пределы диапазона

то, что я пробовал до сих пор:

1) создал попытку / кроме (не работает) 2) попробовал, если / еще (если переменная не "")

Я хотел бы вставить "Нуль", еслиэлемент не существует, поэтому информационный блок Pandas заполняется значением «Null» в случае, если элемент не существует.

любая помощь и руководство будут высоко оценены.

РЕДАКТИРОВАТЬ 1:

Я пробовал следующее:

for url in links:
        driver.get(url)
    try:
            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""")
            title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
            urlinf = driver.current_url #url info
        except:
        pass
        num_page_items = len(date)

        for i in range(num_page_items):
            df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf[i]}, ignore_index=True)

и:

for url in links:
        driver.get(url)
    try:
            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""")
            title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
            urlinf = driver.current_url #url info
        except (NoSuchElementException, ElementNotVisibleException, InvalidSelectorException):
        pass

        num_page_items = len(date)

        for i in range(num_page_items):
            df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf[i]}, ignore_index=True)

и:

for url in links:
        driver.get(url)
    try:
            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""")
            title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
            urlinf = driver.current_url #url info
        except:
          i = 'Null'
          pass

        num_page_items = len(date)

        for i in range(num_page_items):
            df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf[i]}, ignore_index=True)

Я попробовал ту же самую попытку / за исключением точки добавления к Пандам.

РЕДАКТИРОВАТЬ 2 ошибка, которую я получаю:

индексаторror: индекс списка вне диапазона

относится к строке:

df = df.append ({'Company': company [i] .text, 'Date ': date [i] .text,' Title ': title [i] .text,' URL ': urlinf [i]}, ignore_index = True)

1 Ответ

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

Как показывает ваша ошибка, у вас есть ошибка индекса!

Чтобы преодолеть это, вы должны добавить попытку, за исключением области, где возникает эта ошибка.

Также вы используете driver.current_url который возвращает URL.Но в вашем внутреннем цикле for вы пытаетесь обратиться к нему как к списку ... это может быть источником вашей ошибки ...

В вашем случае попробуйте это:

for url in links:
    driver.get(url)
    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""")
    title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
    urlinf = driver.current_url #url info

    num_page_items = len(date)
    for i in range(num_page_items):
        try:
            df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf}, ignore_index=True)
        except IndexError:
            df.append(None) # or df.append('Null')

Надеюсь, вы найдете это полезным!

...