python-3.x - 尽管字符串看似相同,但 Selenium Webdriver 找不到 XPATH
问题描述
这个问题与我之前的两个问题有关:Inducing WebDriverWait for specific elements和Inconsistency 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 检查器”时它没有检测到它们,它似乎仍然没有出现。这对我来说是一个巨大的谜。
解决方案
我发现了问题。xpath 很好,但是在前 4-5 个元素之后,图像被延迟加载。这意味着必须达到不同的解决方案才能抓取这些图像。并不是它们加载时间太长,而是它们只是在 HTML 中加载占位符。
推荐阅读
- r - 如何找到 ID 并将其放入新列
- java - 相对于已在 Java 中排序的另一个数组对数组进行排序的方法
- java - 在 fxml (JavaFx) 中插入按钮
- python - 蛇文件的各种迭代给出相同的错误
- javascript - 如何使用 Laravel WebSockets 通过 Laravel 中的 WebSocket 将消息从客户端发送回服务器?
- c# - 何时在“列表”操作中复制元素 (Concat())
- python - 为什么python以不同的方式解释十六进制字符串?
- sql-server - 用于 SQL 2012 的带重音字符的 BCP 导入
- python-3.x - Python 3:使用 for loop & if 语句和 .append,如何使用 if 语句对不同元素执行一些操作而不覆盖?
- r - 矢量化嵌套 for 循环 - 自制地理编码