我正在尝试创建一个机器人,它使用其xapth从网站检索链接列表,然后点击所有链接。
xpath看起来像这样:[@class="gridicons"]/li[i]/div/ul/li/p/a
i
中的li[i]
来自1
到n
,n
是存在的链接数量。
代码段为:
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.
答案 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"))