Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started

v-stephen-msft

在Power Query中使用Web.page实现正则表达式

引言:

在 Power Query 中,当我们遇到复杂的数据结构,而 M 语言无法直接实现时,我们可以借助其他语言来实现。鉴于 Web.Page 与 HTML 兼容,我将使用 JavaScript 来执行正则表达式,这与使用 M 语言相比是一种更直接的方法。本例获取网络状态信息中的网络请求状态码, 即从[RequestInfo]中提取状态码。

正文:

1.了解Web.page返回的数据结构

最初,我们使用 Web.page 来检索数据。可以观察到,DOM数据被获取,其中包括额外的数组。

vstephenmsft_0-1723171143829.png

 

紧接着,我们可以继续向下查找数据。[Data] 默认的第一次钻取数组名称,{0}为获取该数组中的第一个数据,此处为下一层的数据对象。

= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0})

这一步我们会获取请求类型等数据:

vstephenmsft_0-1723108613332.png

使用下面的code钻取到该数据对象中的[Children]中的第一个数据对象。

 

 

 

 

= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0}[Children]{0})

 

 

 

 

 

Name中的HEAD为请求头,BODY为请求体:

vstephenmsft_0-1723108657091.png

请求头

 

 

 

 

 

= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0}[Children]{0}[Children]{0})

 

 

 

 

 

vstephenmsft_0-1723108746412.png

请求体

 

 

 

 

 

= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0}[Children]{0}[Children]{1})

 

 

 

 

 

可以看到,请求体返回了我们需要的数据。

vstephenmsft_1-1723108807947.png

 

 

 

 

 

= Table.AddColumn(#"Changed Type", "Custom", each Web.Page("<script>document.write('"&[RequestInfo]&"')</script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0})

 

 

 

 

 

我们可以输出返回的数据:

vstephenmsft_0-1723108984992.png

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})

 

 

 

 

 

vstephenmsft_0-1723109046037.png

实现的要求是获取网络请求状态代码。显而易见,它由三位数字组成,因此条件是: /\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 完成。

 

相关资料

正则表达式 - JavaScript | MDN 

Web.Page - PowerQuery M | Microsoft Learn 

 

作者:常天意

指导:Ula&Kerry

 

Comments

cx