Beautiful Soup无法找到外部span内部的span
我正在尝试为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")