首页 > 解决方案 > 在 python selenium 中检查网页上是否加载了 web 元素

问题描述

我想从包含在网站上搜索的名称的个人资料 URL 的网页中抓取“href”标签。有时,如果某个特定的配置文件不存在,它甚至可能给出空结果。我正在使用 python selenium,其中我从 csv 文件中输入名称,并将密钥循环发送到网站上的搜索栏。但是,有时会随机将先前搜索的配置文件 URL 带到现有名称搜索中。这是非常随机发生的,我已经多次检查了代码的逻辑,并且该部分似乎没有错误。

我怀疑在我使用 selenium 指向特定元素之前网页没有完全加载。我尝试过使用 sleep() ,但它也适用于某些值,而且只适用于某些时候。增加睡眠时间只会增加时间而不能保证准确性(经过试验和测试)。

我实际上想要一种方法来检查网页上是否存在此人的 URL,如果存在,我想要该特定人的 URL,而不是前一个人的 URL。有针对这个的解决方法吗。这是一小段代码,它将进一步提高清晰度:

# unique result with name
name = '"' + row[1] + '"'
xpath = "//*[@class='search-result__image-wrapper']/a"
search_query.send_keys(name)
search_query.send_keys(Keys.RETURN)
sleep(5)
#WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.XPATH, xpath)))
links = driver.find_elements_by_xpath(xpath)
if len(links) == 1:
   for link in links:
      url = link.get_attribute('href')
      print('name')

PS:我也经历过关于堆栈溢出的类似问题,但它们似乎都不起作用。我还使用了网络驱动程序等待方法,该方法检查网站上特定元素的可用性,该元素在每次搜索时都会出现,但这似乎也不起作用。

标签: pythonseleniumweb-scraping

解决方案


为什么不等到名称列表中的第一个项目可见,然后分配名称列表并遍历名称列表。请看下面的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

name = '"' + row[1] + '"'
css_first_name = ".search-result__image-wrapper > a:nth-child(1)"
css_name_list = ".search-result__image-wrapper > a"
search_query.send_keys(name)
search_query.send_keys(Keys.RETURN)
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, css_first_name)))
links = driver.find_elements_by_css_selector(css_name_list)
for link in links:
  url = link.get_attribute('href')
  print('name')

推荐阅读