![](/img/trans.png)
[英]How can I get data from a specific class of a html tag using beautifulsoup?
[英]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.