使用 selenium 和 python 进行网页抓取 - 包含文本的 xpath

Web scraping with selenium and python - xpath with contains text

我会尽量让它变得很短。我正在尝试点击从网站搜索中得出的产品。基本上有一个匹配产品列表,我想点击第一个包含我在其标题中搜索的产品名称的产品。 我将 post 网站的 link 以便您可以检查其 DOM 结构:https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and 在这种情况下,许多包含我的查询字符串,我只想单击第一个。

这是我为此编写的代码片段:

def click_on_first_matching_product(self):
        first_product = WebDriverWait(self.driver, 6).until(
            EC.visibility_of_all_elements_located((By.XPATH, f"//a[@class='df-card__main']/div/div[@class=df-card__title] and contains(text(), '{self.product_code}')"))
        )[0]
        first_product.click()

问题是 6 秒过去了,它找不到满足我写的 xPath 条件的元素,但我不知道如何让它工作。 我正在尝试获取搜索结果 a element 并检查其结构中的标题是否包含我搜索的查询字符串。 我能得到一些帮助和解释吗?我对 selenium 和 XPaths 很陌生...

我也可以 link 一份可靠的 selenium 文档吗?我很难找到一个好的。也许一个也解释了如何为 xPaths 创造条件的人。

您的 xpath 似乎 incorrect.Try 按照 xpath 来点击产品。

driver.get("https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and")
def click_on_first_matching_product(product_code):
    first_product = WebDriverWait(driver, 6).until(EC.visibility_of_all_elements_located((By.XPATH,"//div[@class='df-card__title' and contains(text(), '{}')]".format(product_code))))[0]
    first_product.click()
click_on_first_matching_product("CE285A")

您需要考虑几件事。您的 use-case 要么点击第一个搜索结果,要么点击与卡片标题相关的项目。如果单击确定的 WebElement 导致 WebDriverWait for visibility_of_all_elements_located()太昂贵


要点击与卡片标题相关的项目,你必须诱导WebDriverWait for the element_to_be_clickable() and you can use the following based Locator Strategies:

  • 直接使用文本 CE285A Toner Compatible Per Hp LaserJet P1102

    driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='CE285A Toner Compatibile Per Hp LaserJet P1102']"))).click()
    
  • 通过format()为文本使用变量:

    driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and')
    text = "CE285A Toner Compatibile Per Hp LaserJet P1102"
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='{}']".format(text)))).click()
    
  • 通过%s为文本使用变量:

    driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and')
    text = "CE285A Toner Compatibile Per Hp LaserJet P1102"
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='%s']"% str(text)))).click()
    

要点击第一个搜索产品,您必须诱导 WebDriverWait for the element_to_be_clickable() and you can use either of the following Locator Strategies:

  • CSS_SELECTOR:

    driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.df-card>a"))).click()
    
  • XPATH:

    driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='df-card']/a"))).click()
    

注意:您必须添加以下导入:

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