【问题标题】:Unable retrieve a list of elements using find_elements_by_xpath in selenium using python无法使用 python 在 selenium 中使用 find_elements_by_xpath 检索元素列表
【发布时间】:2018-08-21 13:14:33
【问题描述】:

我正在尝试制作一个机器人,它使用它的 xapth 从网站检索链接列表,然后让它点击所有链接。

xpath 看起来像这样:[@class="gridicons"]/li[i]/div/ul/li/p/ali[i] 中的i 是从1nn 是存在的链接数。

代码sn-p为:
urls=driver.find_elements_by_xpath('//[@id="gridicons"]/ul/li/div/ul/li/p/a')

for url in urls:
    driver.execute_script("window.open(arguments[0]);",url.get_attribute("href"))

这很好用,因为find_elements_by_xpath 返回一个列表并将其存储在urls 中。在这种情况下,如果您查看 xpath,每个分区只有一个关联的 url。 Here is an image for reference.

但是,如果每个分区有多个链接,则 xpath 将更改为://*[@class="gridicons"]/li[i]/div/ul/li[j]/p/a 其中i 构成块数,j 是每个块中的链接数。

如果我使用代码:

urls = driver.find_elements_by_xpath('//*[@class="gridicons"]/li/div/ul/li[1]/p/a') print(urls)

为了只检索每个块上的第一个链接,当我打印 url 时,它是一个空列表。我不明白为什么,因为检查元素框向我显示了 url 列表,从而使 xpath 有效。 Here is the image.

【问题讨论】:

  • 添加与简单文本相同的 HTML 示例而不是图像
  • 是的,请添加相关部分的实际 HTML。

标签: python selenium lxml


【解决方案1】:

您没有收到元素列表的原因是因为您使用的是绝对 xpath。这意味着这个 xpath 将导致恰好 1 个元素。

您需要为该元素创建一个相对 xpath。如果你添加你想要的多个a元素的html代码,我可以帮你。

【讨论】:

    【解决方案2】:

    将绝对路径替换为相对路径(注意块的'li'之前的双斜杠):

    urls = driver.find_elements_by_xpath('//*@class="gridicons"]//li/div/ul/li[1]/p/a')
    

    这应该给你所有块

  • s 中的每个第一个
  • 【讨论】:

      【解决方案3】:

      根据WebElement 中单个网址的代码块,以下xpath 有效:

      //[@id="gridicons"]/ul/li/div/ul/li/p/a
      

      现在,对于每个部门的多个链接,您还必须涵盖WebElements 由以下xpath 标识的位置:

      //*[@class="gridicons"]/li[i]/div/ul/li[j]/p/a
      

      如此有效地遍历所有<li>祖先,您可以使用以下代码块:

      urls = driver.find_elements_by_xpath("//[@id='gridicons']/ul//li/div/ul//li/p/a")
      for url in urls:
          driver.execute_script("window.open(arguments[0]);",url.get_attribute("href"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 2018-02-04
        • 2021-04-12
        • 2018-05-26
        • 1970-01-01
        相关资源
        最近更新 更多