繁体   English   中英

python:无法使用 BeautifulSoup 从 html 获取特定数据

[英]python: can't get specific data from html using BeautifulSoup

我正在尝试使用 beautifulsoup 和 urllib 从特定网页中提取给定的百分比: https://app.safespace.io/api/display/live-occupancy/86fb9e11?view=percent 我对这样的东西很陌生。 这是我的意大利面条代码:

import urllib.request

contentSource = urllib.request.urlopen('https://app.safespace.io/api/display/live-occupancy/86fb9e11?view=percent')
read_content = contentSource.read()

from bs4 import BeautifulSoup
soup = BeautifulSoup(read_content, 'html.parser')

try1 = soup.find("span", {"id": "occupancyPct"})

print(try1)

在原始网页上,当“检查元素”百分比时,百分比实际上显示在 html 中,如突出显示的那样。

但是,我的代码打印的 output 是<span class="text-xl" id="occupancyPct" style="margin-bottom: auto;"></span>

请注意我的代码 output 如何不显示 output 中的百分比,这与实际页面的 html 不同。 我究竟做错了什么?

我也会接受“你很愚蠢,因为 X,而你应该做 Y”,或者它的某种变体。

问题是百分比不是 static 字段,它是使用 JavaScript 生成/计算的。 据我所知,使用这种类型的网页抓取,您只能在 JavaScript 或执行某些操作之前提取源代码。 因此该字段保持空白。不幸的是,该字段为空,而不是 chrome 检查工具尝试查看原始源代码。

这里是填写百分比字段的 JavaScript 代码:

var setters = {
          bgClass: (function() {
            var bgSetter = getNumericClassSetter(elms.bg);

            return function(occupants) {
              // get percent, floored to the nearest 5 percent
              var pct = Number(`${ Number(`${occupants}e+2`) / Number(`${maxCapacity}e+2`) }e+2`);
              var floor = pct - (pct % 5);

              if (floor >= 100) {
                bgSetter(105);
              }
              else {
                bgSetter(floor);
              }
            };
          })(),
          occupancyPct: (function(occupants) {
            elms.occupancyPct.innerText = Math.min(100, Math.floor((occupants / maxCapacity) * 100)) + '%';
          }),
        };

据我所知,百分比是用给定的变量计算的。 用您自己的代码计算百分比是否是一种灵魂?

它没有显示百分比,因为该百分比是稍后通过 javascript 计算的。 你得到的 HTML 是第一个没有百分比的。

答案很简单:必须使用selenium

为什么?

您需要一个导航器,因此 javascript 代码将被执行,并且您正在寻找的百分比将在那里,在页面的代码源中,您所要做的就是找到一个技巧来获取它。

该页面是动态加载的,因此requests将不支持它。 我们可以用 Selenium来替代抓取页面。

安装它: pip install selenium

这里下载正确的 ChromeDriver。

from time import sleep
from selenium import webdriver
from bs4 import BeautifulSoup

URL = "https://app.safespace.io/api/display/live-occupancy/86fb9e11?view=percent"
driver = webdriver.Chrome(r"c:\path\to\chromedriver.exe")
driver.get(URL)
# Wait for page to fully render
sleep(5)

soup = BeautifulSoup(driver.page_source, "html.parser")
print(soup.find("span", {"id": "occupancyPct"}).text)

driver.quit()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM