【问题标题】:Web Scraping Linkedin Profiles: Cannot pick all linksWeb Scraping Linkedin Profiles:无法选择所有链接
【发布时间】:2019-12-24 18:56:07
【问题描述】:

以下是正在使用的代码:

linkedin_urls = driver.find_elements_by_class_name('r')

sub = 'linkedin.com'

for linkedin_url in linkedin_urls:
    tag = linkedin_url.find_element_by_tag_name('a')
    URL = tag.get_attribute('href')

    if sub in URL:
       try:
          driver.get(URL)
          sleep(5)
          driver.back()
          driver.get(URL)
       except:
          pass
  • 以下是我得到的错误:

Traceback(最近一次调用最后一次):

文件“”,第 25 行,在 tag = linkedin_url.find_element_by_tag_name('a')

文件 "C:\Users\deepankar.garg\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\webelement.py", 第 305 行,在 find_element_by_tag_name 中 return self.find_element(by=By.TAG_NAME, value=name)

文件 "C:\Users\deepankar.garg\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\webelement.py", 第 659 行,在 find_element 中 {"using": by, "value": value})['value']

文件 "C:\Users\deepankar.garg\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\webelement.py", 第 633 行,在 _execute return self._parent.execute(command, params)

文件 "C:\Users\deepankar.garg\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\webdriver.py", 第 321 行,在执行中 self.error_handler.check_response(response)

文件 "C:\Users\deepankar.garg\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\errorhandler.py", 第 242 行,在 check_response 中 raise exception_class(message, screen, stacktrace)

StaleElementReferenceException:过时的元素引用:元素是 未附加到页面文档(会话信息: 铬=79.0.3945.79)

下面是IF条件之前的输出:

https://www.linkedin.com/in/elena-grewal

https://www.quora.com/What-is-the-difference-between-Data-Science-and-Analytics

https://www.edureka.co/blog/what-is-data-science/

以下是IF条件后的输出:

https://www.linkedin.com/in/elena-grewal

https://in.linkedin.com/in/bsatya

https://www.linkedin.com/in/kylemckiou

我知道错误的含义,但我不知道如何解决它。我只想在单独的网络浏览器中打开“if”(true)条件下的每个链接。上述“IF 之后”条件中的链接是我希望在每个选项卡中打开的。

任何帮助将不胜感激!

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver web-scraping


    【解决方案1】:

    StaleElementReferenceException 出现在该元素不再存在于 div 中或已过时。在您的场景中,当您在导航到下一页后返回该 url 时,当您再次尝试访问该元素时,该元素已过时。

    要解决它,您需要在访问之前再次获取该元素。
    你可以这样做:

    linkedin_urls = driver.find_elements_by_class_name('r')
    
    sub = 'linkedin.com'
    
    while i < len(linkedin_urls): 
        tag = linkedin_urls[i].find_element_by_tag_name('a')
        URL = tag.get_attribute('href')
        i += 1
    
        if sub in URL:
           try:
              driver.get(URL)
              sleep(5)
              driver.back()
              driver.get(URL)
              # Fetching the element again here
              linkedin_urls = driver.find_elements_by_class_name('r') 
           except:
              pass
    

    【讨论】:

    • 感谢萨米尔的回复!但是,您的建议与 driver.back() 相同。此外,我确实尝试了你所说的,但没有任何好处!它转到后页并重新获取第一个链接,而我希望它获取每个链接。
    • @DeepankarGarg 请尝试更新的代码,我现在在获取 url 时使用了索引,所以这一次,它将在第二次迭代中获取第二个链接,在第三次迭代中获取第三个链接,依此类推第四。
    • 我明白你在说什么,但还是不行!它仍然只给我一个配置文件!主要问题发生在 IF 条件内。在 IF 之外,我大约有 15 个链接,在 IF 条件之后,我得到 10 个链接。我必须以某种方式在这 10 个链接上运行迭代循环,以便让它们在新窗口中打开每个配置文件。
    • 我已经编辑了我的问题。也许现在会有帮助!
    【解决方案2】:

    终于!

    我得到了解决方案。以下是我尝试过的东西,它奏效了:

    all_urls = driver.find_elements_by_css_selector("div > a")
    
    urls = []
    for elem in all_urls:
    text = elem.text
    url = elem.get_property('href')
    if "linkedin.com" in elem.text:
        urls.append(url) 
    #print(urls)
    for url in urls:
       driver.get(url)
       sleep(2)
       print(url)
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 2012-07-15
      • 2021-08-31
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多