Beautiful Soup 并通过 ID 提取 div
Posted
技术标签:
【中文标题】Beautiful Soup 并通过 ID 提取 div【英文标题】:Beautiful Soup and extracting a div by ID 【发布时间】:2020-09-03 15:20:20 【问题描述】:我正在尝试从此页面https://coronavirus.gob.mx/datos/ 中提取 COVID-19 的“确认”病例数
这是我的代码行table_div = soup.find('div', "id": "gsPosDIV")
但不起作用,我真的是网络抓取的新手。
提取这些数据的正确形式是什么?
这是html
<div id="gsPosDIV" class="h5 mb-0 font-weight-bold text-gray-800">47,144</div
【问题讨论】:
你能贴出html
的代码吗?
将您的代码放入 setTimeut 并让它等待几秒钟,同时页面加载
当然是的 47,144
【参考方案1】:
数据通过 javascript 动态加载。你可以通过requests
模块模拟Javascript请求,然后用re
模块解析数据:
import re
import requests
data = 'sPatType': 'Confirmados',
'cve': '000',
'nom': 'Nacional'
url = 'https://coronavirus.gob.mx/datos/Overview/info/getInfo.php'
raw_data = requests.post(url, data=data).text
positivos = re.search(r'document\.getElementById\("gsPosDIV"\)\.innerHTML = \((\d+)', raw_data).group(1)
print(positivos)
打印:
47144
【讨论】:
谢谢!那么当我们有动态数据时,Beautiful Soup 不是获取数据的最佳方式吗? @MarianaFernandez 在一般情况下不,BeautifulSoup 适合静态数据。但有时返回的动态数据是 HTML 格式,所以 BeautifulSoup 在这种情况下很方便。 谢谢! :D 还有一个问题。为什么网址改变了?我很抱歉这些问题 @MarianaFernandez 我在 Firefox 开发者工具的“网络”选项卡中找到了这个 URL(Chrome 也有类似的东西)。主页正在向此 url 发出请求以获取信息。 这是“Hospitalizados”的代码行 document.getElementById("vHos").innerHTML = "39.15 %";我试图根据其他表达式构建正则表达式,这是我的结果: re.search(r'document\.getElementById("vHos")\.innerHTML = \\d+(?:\\.\\ d+)?%', raw_data).group(1) 但不工作,我不知道为什么以上是关于Beautiful Soup 并通过 ID 提取 div的主要内容,如果未能解决你的问题,请参考以下文章
Python Beautiful Soup - 通过 Steam 的年龄检查
使用 Beautiful Soup 提取链接的等效正则表达式