【问题标题】:Scrape Dynamically Loaded Href attribute with Selenium and BeautifulSoup4使用 Selenium 和 BeautifulSoup4 抓取动态加载的 Href 属性
【发布时间】:2020-11-29 01:20:09
【问题描述】:

我尝试使用 Selenium 和 BeautifulSoup4 抓取动态加载的 href 属性。

当我查看网站源时,href 属性为空但是当我单击检查元素时,href 属性将有一个链接。表示 href 属性是动态加载的。如何提取该链接?

我正在尝试使用以下代码

def Scrape_Udemy():
    driver.get('https://couponscorpion.com/marketing/complete-guide-to-pinterest-pinterest-growth-2020/')
    content = driver.page_source
    soup = BeautifulSoup(content, 'html.parser')
    course_link = soup.find_all('div',{'class':"rh_button_wrapper"})
    for i in course_link:
        link = i.find('a',href=True)
        if link is None:
           print('No Links Found')
        print(link['href'])

但是当我运行这个函数时,这是打印 []。我正在使用 Chrome 驱动程序我该如何解决这个问题。我想抓取来自 Url https://couponscorpion.com/marketing/complete-guide-to-pinterest-pinterest-growth-2020/的免费优惠券代码链接

【问题讨论】:

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


    【解决方案1】:

    两件事

    1. 在获取页面源之前需要单击一个允许框
    2. 您的链接是span 的直接子代,而不是div

    代码

    import time
    from selenium import webdriver
    from bs4 import BeautifulSoup
    driver = webdriver.Chrome(executable_path=r'c:\users\aaron\chromedriver.exe')
    driver.get('https://couponscorpion.com/marketing/complete-guide-to-pinterest-pinterest-growth-2020/')
    time.sleep(5)
    driver.find_element_by_xpath('//button[@class="align-right primary slidedown-button"]').click()
    content = driver.page_source
    soup = BeautifulSoup(content, 'html.parser')
    course_link = soup.find_all('span',{'class':"rh_button_wrapper"})
    for i in course_link:
        link = i.find('a',href=True)
        if link is None:
            print('No Links Found')
        print(link['href'])
    

    输出

    https://couponscorpion.com/scripts/udemy/out.php?go=Q25aTzVXS1l0TXg1TExNZHE5a3pEUEM4SUxUZlBhWEhZWUwwd2FnS3RIVC96cE5lZEpKREdYcUFMSzZZaGlCM0V6RzF1eUE3aVJNaURZTFp5L0tKeVZ4dmRjOTcxN09WbVlKVXhOOGtIY2M9&s=e89c8d0358244e237e0e18df6b3fe872c1c1cd11&n=1298829005&a=0
    

    解释

    始终查看driver.get() 时会发生什么,有时需要单击某些框才能获取页面源。必须进行所有浏览器活动。

    我们正在使用 XPATH 选择器在该框上找到要单击的元素。

    //button[@class="align-right primary slidedown-button"]
    

    这意味着

    // - The entire DOM 
    button - The HTML tag we want
    [@class=""] - The HTML tag with class "" 
    

    我通常会在访问元素之前等待一些时间,此页面需要一段时间才能加载,并且通常您需要添加一些等待才能获得所需的元素或页面的一部分。

    有几种方法可以做到这一点,这是使用模块时间的快速而肮脏的方法。有一些特定的方法可以使用 selenium 等待元素出现。我实际上尝试过这些,但无法让它发挥作用。

    请参阅文档中的herehere 了解值得了解的具体部分。

    如果您查看 HTML,您会发现链接位于 span 类的 rh_button_wrapper 元素后面,而不是 div。

    【讨论】:

    • 兄弟显示错误:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//button[@class="align-right primary slidedown-button"]"} 兄弟我想从所有优惠券蝎子帖子中删除课程链接是否适用于所有帖子??
    • 它适用于您在问题中指定的特定站点。我不能确定它是否适用于所有帖子。你的帖子里没有说清楚,那是你的意图。我会用我给你的建议。查看 driver.get(url) 以获取您获得的特定 url。你收到通知框加载了吗?如果不是,则不需要那段代码。如果是,按钮类属性是否相同?如果不是,那么您需要更改它。是时候让你在这里做一些繁重的工作了,试试这个并报告。例外情况可以为您提供大量信息。
    • 兄弟,在帖子上显示错误,我说你首先请清除此帖子问题,然后我将在其他帖子上做所有事情...我正在 Heroku 免费服务器上进行测试...使用无头和无沙盒 Chromedriver 选项。我需要右侧帖子末尾提供的 免费优惠券框有限优惠 86% 优惠按钮链接...
    • 我不知道你在这里想要什么。我已经在您发布的网址上的 SO 答案中准确地测试了这段代码。有用。如果它不在你的尽头。请按照我在上面的评论中给出的指导进行操作。你有一个无元素例外。通过此评论上方的 cmets 建议弄清楚这可能是什么。 Selenium 很脆弱,查看无头浏览器中发生的事情可能很简单,因为您的浏览器需要很长时间才能加载页面。改变那个。您需要在这里做一些繁重的工作,我已经给出了代码和清晰的解释,以获取此页面的优惠券链接。
    • 我只是说你提取了错误的链接。如果你想帮忙,请检查我的旧评论并回答建议编辑,否则我会尝试自己做。谢谢你的解释: )
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多