首页 > 解决方案 > 尽管字符串看似相同,但 Selenium Webdriver 找不到 XPATH

问题描述

这个问题与我之前的两个问题有关:Inducing WebDriverWait for specific elementsInconsistency in scraping through <div>'s in Selenium

我正在从https://www.grailed.com/上刮掉所有的 Air Jordan 运动鞋。提要是一个无限滚动的运动鞋列表,我正在使用 Selenium webdriver 来抓取数据。我的问题是鞋子的图像似乎需要一段时间才能加载,因此会引发很多错误。我在图像的 xpath 中找到了模式。第一张图片的 xpath 是 /html/body/div[3]/div[6]/div[3]/div[3]/div[2]/div[2]/ div[1] /a/div [2]/img,第二个是/html/body/div[3]/div[6]/div[3]/div[3]/div[2]/div[2]/ div[2] / a/div[2]/img 等。它遵循这个线性序列,其中倒数第二个 div 索引每次增加一个。为了解决这个问题,我将以下内容放入我的循环中(仅包含相关代码)。

    i = 1
    while len(sneakers) < sneaker_count:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # Get sneakers currently on page and add to sneakers list
    feed = driver.find_elements_by_class_name('feed-item')
    for item in feed:
        xpath = "/html/body/div[3]/div[6]/div[3]/div[3]/div[2]/div[2]/div[" + str(i) +   "]/a/div[2]/img"
        img = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, xpath)))
        i += 1
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

问题是,大约在第5双鞋之后,wait语句超时,似乎无法识别在那双鞋之后传入的xpath。我使用 FireFox Developer 使用复制 xpath 功能检查 xpath,当我打印它时,它似乎与传入的 xpath 相同。我使用带 Selenium 的 ChromeDriver,但我认为这无关紧要。有谁知道为什么 xpath 停止被识别,即使它们看起来相同?

更新:因此,使用 Chrome 的 Xpath 检查器插件,它会检测项目 1-4 的 xpath,但通常在 6 后停止检测它们。当我检查 xpath 时(在 Chrome 和 FireFox 开发人员模式下,xpath 看起来仍然相同,但是当我使用“CSS 和 Xpath 检查器”时它没有检测到它们,它似乎仍然没有出现。这对我来说是一个巨大的谜。

标签: python-3.xseleniumfirefoxxpathweb-scraping

解决方案


我发现了问题。xpath 很好,但是在前 4-5 个元素之后,图像被延迟加载。这意味着必须达到不同的解决方案才能抓取这些图像。并不是它们加载时间太长,而是它们只是在 HTML 中加载占位符。


推荐阅读