Python 网页抓取跨度 ID 使用美丽的汤

时间:2021-02-11 21:39:41

标签: python beautifulsoup

我试图从跨度 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)

website screenshot

1 个答案:

答案 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>&nbsp;&nbsp;(+<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()