Beautiful Soup无法找到外部span内部的span

0 投票
1 回答
35 浏览
提问于 2025-04-14 16:12

我正在尝试为Udemy课程建立一个价格跟踪器,这是我个人的项目,因为我经常查看这个网站,看看我想买的课程有没有打折。我想用Beautiful Soup这个工具从HTML代码中提取价格。每次我测试我的代码,当它运行到这一行:price = soup.find(class_='usdr-sr-only').get_text()时,都会出现“NoneType对象没有属性'get_text'”的错误(我在代码中确实在get_text后面加了())。

这是相关代码的上下文:

import requests, os, lxml
from bs4 import BeautifulSoup

UDEMY_CLASS = input("Please provide the URL for the course whose price you'd like to track: ")
url = UDEMY_CLASS

header = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9"
}
response = requests.get(url, headers=header)

soup = BeautifulSoup(response.content, "lxml")
print(soup.prettify())
        
price = soup.find(class_="usd-sr-only").get_text()
#price_without_currency = price.split("$")[1] not always needed- inspect element
price_as_float = float(price)

这是页面中显示价格的HTML部分:

<div class="base-price-text-module--price-part---xQlz ud-clp-discount-price ud-heading-xl" data-purpose='course-price-text'> == $0
    <span class="ud-sr-only">Current price</span>
        <span>$13.99</span>

我首先想到的是我可能告诉Beautiful Soup去找错了类。那我该怎么做才能找到包含价格文本的那个span呢?如果需要我提供更多信息,请告诉我,非常感谢任何建议。

1 个回答

1

由于Udemy对requests进行了限制,你可以用Selenium来代替requests。你可以把代码中的这一部分:

response = requests.get(url, headers=header)
soup = BeautifulSoup(response.content, "lxml")

替换成这一部分:

browser = webdriver.Chrome(executable_path=chrome_driver_path)
browser.get(url)
soup = BeautifulSoup(browser.page_source, "lxml")

如果你想在无头模式下运行脚本(也就是说,Chrome浏览器不会打开,程序会静默运行),那么可以使用这一部分:

options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome(executable_path=chrome_driver_path, options=options)
browser.get(url)
soup = BeautifulSoup(browser.page_source, "lxml")

撰写回答