在Python中使用Selenium循环链接

1 投票
3 回答
1703 浏览
提问于 2025-04-18 03:55

我想用Python中的Selenium循环访问一组链接。 我尝试按照这个说明去做,但没有成功。 我一直遇到“过时元素引用错误”(我在尝试使用WebDriverWait)。 我的代码如下:

list_of_links = mydriver.find_elements_by_xpath('//ul[@class="directory dir-col"]/li/a')
for link in list_of_links:
UI.WebDriverWait(mydriver, 30).until(lambda mydriver:mydriver.find_element_by_xpath('//ul[@class="directory dir-col"]/li/a'))        
link.click()
mydriver.back()

我确实尝试过在点击和返回命令之前和之后放置webdriver等待命令,但仍然没有成功。 任何帮助都会非常感激。

3 个回答

-2

对于这类任务,我建议你使用irobotsoft的网页抓取工具。这个视频展示了怎么使用它:http://irobotsoft.com/help/record%20robot.swf

1

问题在于,一旦你离开这个页面,list_of_links里的元素就会变得过时了。

这个方法应该适合你,前提是每个链接的文本都不一样:

list_of_links = mydriver.find_elements_by_xpath('//ul[@class="directory dir-col"]/li/a')
list_of_linktext = []
for link in list_of_links:
    list_of_linktext.append(link.text)

for linktext in list_of_linktext:
    mydriver.find_element_by_link_text(linktext).click()
    mydriver.back()
0

根据Richard的想法,我决定用xPath的值来循环,而不是用链接的文本(因为它们可能是一样的)。我最终写出的代码是:

import lxml.html as lh
import urllib2
from selenium import webdriver

htmlObject = lh.parse(urllib2.urlopen(start_url))
listOfPaths = htmlObject.xpath('//ul[@class="directory dir-col"]/li/a')
listOfLinkPathes = []
for link in listOfPaths:
    listOfLinkPathes.append(htmlObject.getpath(link))
for linkPath in listOfLinkPathes:
   mydriver.find_element_by_xpath(linkPath).click()
   mydriver.back()

撰写回答