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的主要内容,如果未能解决你的问题,请参考以下文章

用 Beautiful Soup 提取 href

Python Beautiful Soup - 通过 Steam 的年龄检查

使用 Beautiful Soup 提取链接的等效正则表达式

Beautiful Soup - 在 div 之后提取

python 使用Beautiful Soup从页面中提取数据

Beautiful Soup