The ultimate Microsoft Fabric, Power BI, Azure AI, and SQL learning event: Join us in Stockholm, September 24-27, 2024.
Save €200 with code MSCUST on top of early bird pricing!
Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started
引言:
在 Power Query 中,当我们遇到复杂的数据结构,而 M 语言无法直接实现时,我们可以借助其他语言来实现。鉴于 Web.Page 与 HTML 兼容,我将使用 JavaScript 来执行正则表达式,这与使用 M 语言相比是一种更直接的方法。本例获取网络状态信息中的网络请求状态码, 即从[RequestInfo]中提取状态码。
正文:
1.了解Web.page返回的数据结构
最初,我们使用 Web.page 来检索数据。可以观察到,DOM数据被获取,其中包括额外的数组。
紧接着,我们可以继续向下查找数据。[Data] 默认的第一次钻取数组名称,{0}为获取该数组中的第一个数据,此处为下一层的数据对象。
= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0})
这一步我们会获取请求类型等数据:
使用下面的code钻取到该数据对象中的[Children]中的第一个数据对象。
= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0}[Children]{0})
Name中的HEAD为请求头,BODY为请求体:
请求头
= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0}[Children]{0}[Children]{0})
请求体
= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0}[Children]{0}[Children]{1})
可以看到,请求体返回了我们需要的数据。
= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0})
我们可以输出返回的数据:
2.使用 JavaScript 正则表达式
按照上述步骤,我们可以轻松地在 HTML 环境中获取必要的数据。因此,我们唯一的要求就是编写所需的函数,以方便正则表达式的直接执行。如下,Custom列成功返回了RequestInfo列中的网络状态码。
= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"'.match(/\b\d{3}\b/g))</script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0})
实现的要求是获取网络请求状态代码。显而易见,它由三位数字组成,因此条件是: /\b\d{3}\b/.
可以观察到,样本数据包含多个或单个状态代码,分散在不同位置,还包括 "32145 "等错误数据。使用正则表达式可以准确地筛选出这些数据。如果使用 M 语言,则可能需要使用 Text.Contains、Text.StartsWith 和 Text.EndsWith 等函数。特别是当数据分布不一致时,可能还需要使用 Text.Replace,这使得过滤过程的实现具有挑战性。
总结:
通过探索,我们可以使用该语句获取所需的数据:
Web.Page("<script>Your Fuction</script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}
M 语言中难以实现的功能,可以尝试使用 JavaScript 完成。
相关资料
Web.Page - PowerQuery M | Microsoft Learn
作者:常天意
指导:Ula&Kerry
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Subject | Kudos |
---|---|
2 | |
2 | |
1 | |
1 | |
1 |