【问题标题】:Python Selenium driver.get() not opening all of my URLsPython Selenium driver.get() 没有打开我所有的 URL
【发布时间】:2019-12-13 13:27:44
【问题描述】:

我有一段代码如下(不是完整代码,只是我查询的相关sn-p):


linkedin_urls = driver.find_elements_by_xpath('//*[@href]')

for linkedin_url in linkedin_urls:
   hopeful = linkedin_url.get_attribute('ping')
   if hopeful and len(hopeful) > 0:
       actual = hopeful[31:]
       new = actual[:-50]
       if new.startswith('https://uk.linkedin.com'):
          print(new) 
          #driver.get(new)
          time.sleep(2) 

当我打印结果时,每个linkedin URL 都正确打印,没有错误。当我手动将这些复制并粘贴到搜索栏中时,它们都会打开所需的配置文件。但是,如果我删除 driver.get(new) 前面的 # 并运行该部分,它会打开列表中的第一个linkedin url,然后出现以下错误

"Message: stale element reference: element is not attached to the page document". 

我不知道为什么所有的网址都打印正确,如果手动复制并粘贴到搜索栏中,每个网址都会打开所需的页面。我希望所有的网址都一个一个打开。

任何帮助将不胜感激!

亲切的问候,

德里赫

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    “消息:过时的元素引用:元素未附加到页面文档”。

    这说明当您导航到新页面时,页面会刷新,并且初始化的元素不再引用该页面。

    要解决此问题,您需要再次重新初始化元素。

    linkedin_urls = driver.find_elements_by_xpath('//*[@href]')
    
    for linkedin_url in range(len(linkedin_urls)):
    
       #Re-Initialized the elements again 
       linkedin_urls = driver.find_elements_by_xpath('//*[@href]')
    
       hopeful =linkedin_urls[linkedin_url].get_attribute('ping')
       if hopeful and len(hopeful) > 0:
           actual = hopeful[31:]
           new = actual[:-50]
           if new.startswith('https://uk.linkedin.com'):
              print(new)
              driver.get(new)
              driver.back()
              time.sleep(2) 
    

    希望你照顾好这个。

    【讨论】:

    • 非常感谢您的帮助。这现在开始变得更有意义了。我是 python 新手,感谢您为我提供帮助的时间和努力!运行 google 搜索页面后,似乎只是刷新而不是打开单个链接,但是所有单个 url 再次完美打印。将继续朝着同一个方向努力,并希望找出原因!
    • 很高兴听到这个消息。欢迎接受并投票赞成答案,以便它可以帮助其他读者。在这里看到。谢谢。 stackoverflow.com/help/someone-answers
    • 在这两种情况下都可以,因为您的页面正在刷新。
    【解决方案2】:

    当行 driver.get(new) 时,您使用 driver.find_elements_by_xpath('//*[@href]') 发现的元素正在从您的 DOM 中删除,这解释了您的错误消息。

    【讨论】:

      【解决方案3】:

      正如 ZolouDu 解释的那样,错误是由于引用了您从其中抓取 URL 的上一页的 DOM 元素。现在,当加载新页面时,旧引用会丢失,从而导致错误。

      您可以做的是将这些引用的字符串转换为实际的字符串。只需使用以下行来创建新列表,而不是您正在使用的列表。

      new=[str(b) for b in actual[:-50]]
      

      【讨论】:

      • 感谢您的回复。我想我开始理解这个错误。我应该在我的代码中哪里嵌入这块?当我返回“AttributeError:'list'对象没有属性'startswith'”的新错误时,如果我replce“new = actual[:-50]”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      相关资源
      最近更新 更多