我试图从跨度 ID 中提取数字数据,但我得到的输出是“--”。该代码没有错误消息,但不会打印像“58990”这样的数字,而是打印“--”。这个网站基本上每 24 小时更新一个数字,我希望每次更新这个数字时我的代码都会被刮掉。
page = requests.get("https://covidtracker.fr/vaccintracker/")
soup = BeautifulSoup(page.content,"html.parser")
home = soup.find(class_="page-template page-template-template_vaccintracker page-template-template_vaccintracker-php page page-id-3717")
posts = home.find_all(class_="wrap")
for post in posts:
title = post.find(id="nb_doses_injectees_24h")
print(title.text)
答案 0 :(得分:0)
首先,最好在所有 soup
对象中使用标签名称。其次,在 bs4 中,class
只能调用 class_
属性。所有其他属性都应作为字典传递。
soup.find('<tag_name>', {'<attr_name>': '<attr_value>'})
不幸的是,您正在抓取的网站是动态网站,这意味着您无法通过使用 bs4
调用静态元素来抓取它。如果您查看页面源代码并查找您抓取的标签,您将看到:
<div class="wrap"> <div class="one"> <span id="nb_doses_injectees" style="font-size:200%; margin-top:5px; margin-bottom: 3px;">--</span> (+<span id="nb_doses_injectees_24h">--</span>
这就是您得到 --
的原因。您需要切换到 selenium
来抓取 JS-based
个网站。下面的一个将非常适合您的情况:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
url = 'https://covidtracker.fr/vaccintracker/'
chrome_driver_path = 'chromedriver'
chrome_options = Options()
chrome_options.add_argument('--headless')
webdriver = webdriver.Chrome(ChromeDriverManager().install())
with webdriver as driver:
# Set timeout time
wait = WebDriverWait(driver, 10)
# Retrieve url in headless browser
driver.get(url)
data = driver.find_element_by_xpath('//*[@id="nb_doses_injectees_24h"]').text
# Result is data = "61 643"
driver.close()