无法使用python

时间:2018-03-13 10:14:55

标签: python selenium lxml

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

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

代码段为:
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)

为了只检索每个块上的第一个链接,当我打印网址时,它是一个空列表。我无法理解为什么因为inspect元素框显示了url列表,从而使xpath有效。 Here is the image.

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

这应该给你每一个< li>在所有块< li> s

答案 2 :(得分:0)

根据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"))