首页 文章

无法从网站收集链接(Python)

提问于
浏览
1

我正在用Python编写一个程序来收集网站上的链接 . 代码是:

links = driver.find_elements_by_xpath('//*[@href]')
for link in links:
     print(link.get_attribute('href'))
time.sleep(1)

我在一些网站上尝试过,效果很好 . 问题是当我在特定网站(www.ifood.com.br)中使用时 . 它收集一些链接,然后返回一些错误 . 我是Python的初学者,所以我不知道他们的意思 . 拜托,我需要一些帮助 .

代码的结果:

https://d1jgln4w9al398.cloudfront.net/imagens/ce/wl/www.ifood.com.br/favicon.ico https://d1jgln4w9al398.cloudfront.net/site/2.1.238-20181023.22/css/main . css https://fonts.googleapis.com/css?family=Open Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800 https://www.ifood.com.br/ Traceback(最近呼叫最后一次):文件“C:\ Users \ jorda \ Desktop \ Python - Projetos \ digitar ifood.py”,第32行,打印(link.get_attribute('href'))文件“C:\ Users \ jorda \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py“,第143行,在get_attribute中resp = self._execute(Command.GET_ELEMENT_ATTRIBUTE,{'name':name})文件”C: \ Users \ jorda \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py“,第633行,在_execute中返回self._parent.execute(command,params)文件“C:\ Users \ jorda \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,第321行,执行te self.error_handler.check_response(response)文件“C:\ Users \ jorda \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py”,第242行,在check_response中引发exception_class(message,screen,stacktrace)selenium.common.exceptions.StaleElementReferenceException:消息:陈旧元素引用:元素未附加到页面文档(会话信息:chrome = 70.0.3538.77)(驱动程序信息:chromedriver = 2.42 .591088(7b2b2dca23cca0862f674758c9a3933e685c27d5),platform = Windows NT 10.0.17134 x86_64)

1 回答

  • 1

    在您的错误日志中,您可以看到

    selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

    通常,当您尝试与DOM中不再存在的Web元素进行交互时,会发生这种情况 . 典型的场景可以描述为

    • 您打开了一个网页 .

    • 查找一些元素并将其保存到变量中 .

    • 页面DOM已更改(例如重新加载) .

    • 您仍然可以看到相同的页面,但是从selenium的角度来看,第2步中的元素是STALE .

    因此,在您的情况下,您可以在调用 .findElements 之前尝试确保页面已完全加载(即不恢复DOM) . 检查这是否能解决问题的最简单方法是在调用.findElements之前添加一个睡眠 .

    time.sleep(5)
    links = driver.find_elements_by_xpath('//*[@href]')
    for link in links:
         print(link.get_attribute('href'))
    

    请注意,建议不要使用睡眠 . 因为例如,如果5秒工作,现在,无法保证在某些时候(由于连接不良)它不会破坏您的测试 . 相反,使用智能等待条件,该条件将重复检查'page loaded'条件并仅在发生时继续 . 更多细节可以在这里找到:Python Selenium stale element fix

相关问题