python - 如何使用json api获取html数据?

标签 python html json web-scraping

我正在抓取 khanacademy 上的个人资料页面。我使用他们的 API(json 文件格式)来做到这一点。

这是我想要抓取的个人资料链接:https://www.khanacademy.org/profile/Viruslala/

这是它的 API 链接: https://www.khanacademy.org/api/internal/user/kaid_896965538702696832878421/profile/widgets?lang=en&_=190427-0731-8941ef3f07bd_1556382106890

我的问题:大部分数据显示在 json 文件(API)上。但我想抓取的一些具体数据没有显示。

我尝试搜索不同的 API 链接,但没有找到正确的链接。

在第一张图片上,我想抓取两种数据:蓝色数据和黄色数据。

enter image description here

在 json 文件上:显示蓝色。但不是黄色。

enter image description here

我的问题是: 为什么黄色不显示? 我如何使用他们的 API 获得黄色信息?

最佳答案

黄色(个人资料信息)可以从原始 URL 响应文本中进行正则表达式处理。

探索json这里。模式r导致提取字符串,该字符串可以用json加载以生成包含所有信息的字典。

import requests
import json
import re

res = requests.get('https://www.khanacademy.org/profile/Viruslala/')
r = re.compile(r'profileInitOptions":(.*),"view"', re.DOTALL)
data = json.loads(r.findall(res.text)[0])
profile_data = data['profileData']
print(profile_data)
<小时/>

注释:

当 javascript 在页面上运行时,页面会从 script 标记动态加载所需的内容。由于 js 不随请求运行,您仍然可以应用正则表达式模式来获取包含感兴趣数据的 javascript 对象。您可以使用以下方式指定模式:

r = re.compile(r'profileInitOptions":(.*),"view"', re.DOTALL)

然后将其应用于响应文本 res.text,并提取第一个返回的匹配项:

r.findall(res.text)[0]

对于这个页面,返回的内容可以用json库解析:

json.loads(r.findall(res.text)[0])

该字符串现在位于名为 data 的字典对象中,您可以通过键从中访问信息

data['profileData']
<小时/>

正则表达式:

enter image description here

<小时/>

re.DOTALL

制作“.”特殊字符完全匹配任何字符,包括换行符;没有这个标志,'.'将匹配除换行符之外的任何内容。对应于内联标志 (?s)。

关于python - 如何使用json api获取html数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55882837/

相关文章:

ios - 如何将 apple-app-site-association 的 content/mime 类型设置为 application/json

python - 在现有的 Excel 工作表上保存 Pandas 系列

python - Pandas ,忽略 NaN 的滚动最大值

python - 在 Python 中导入值

html - 将鼠标悬停在图像上时的文本动画

ruby-on-rails - 从其 json 表示形式获取 IPAddr 实例

python - 初学者 python 循环

html - 打印 html (IE 8-11) 时每页边距大小发生变化

javascript - Angularjs - 动态插入指令到dom元素

java - 如何使用 Java 解析 JSON 二维数组