xpath — IndexError: список индексов вне диапазона после выбора элемента с путем

#python #selenium #xpath #webdriver #index-error

#python #селен #xpath #webdriver #индекс-ошибка

Вопрос:

Я получаю следующую ошибку индекса при попытке запустить приведенный ниже код (найден здесь: https://github.com/israel-dryer/Twitter-Scraper/blob/main/twitter-scraper-tut.ipynb ):

card = cards[0]
Ошибка IndexError: индекс списка вне диапазона

Поскольку я новичок в Python, не могли бы вы помочь мне разобраться в этом, пожалуйста? Большое спасибо!!!

 card = driver.find_elements_by_xpath('//div[@data-testid="tweet"]')
card = cards[0]

#function that collects tweets while scrolling; filters out sponsored tweets; saves tweets in Tuple
def get_tweet_data(card):
    # get username of the tweet
    username_tweet = card.find_element_by_xpath('.//span').text
    # get Twitter Handle
    handle_tweet = card.find_element_by_xpath('.//span[contains(text()."@")]').text

    # get date of post - if no date, then sponsored tweet - then do not return
    try:
        date_tweet = card.find_element_by_xpath('.//time').get_attribute('datetime')
    except NoSuchElementException:
        return
    # get Text of Tweet
    comment = card.find_element_by_xpath('.//div[2]/div[2]/div[1]').text
    responding = card.find_element_by_xpath('.//div[2]/div[2]/div[2]').text
    text_tweet = comment   responding
    # number of replies, retweets, likes
    reply_count = card.find_element_by_xpath('.//div[@data-testid="reply"]').text
    retweet_count = card.find_element_by_xpath('.//div[@data-testid="retweet"]').text
    like_count = card.find_element_by_xpath('.//div[@data-testid="like"]').text

    tweet = (username_tweet, handle_tweet, date_tweet, text_tweet, reply_count, retweet_count, like_count)
    return tweet

get_tweet_data(card)


  

Ответ №1:

Это означает, что driver.find_elements_by_xpath('//div[@data-testid="tweet"]') ничего не возвращает, т.Е. Нет элементов, соответствующих этому xpath

Ответ №2:

find_elements_by_xpath() возвращает список найденных элементов или None, если элементы не найдены. Итак, в этом случае вам нужно проверить длину «карты», прежде чем получать из нее элементы. Например.:

 cards = driver.find_elements_by_xpath('//div[@data-testid="tweet"]')
if len(cards) > 0:
    card = cards[0]
else:
    raise NoSuchElementException('No cards were found')
  

Может быть, было бы лучше, если бы вы использовали driver.find_element_by_xpath() вместо driver.find_elements_by_xpath() — он вернет исключение, если элементы не найдены.