分享

全网首发,重要文档免费下载!彻底解锁Html.Table函数,轻松实现源码级网页数据提取 | Power BI

 大海_Power 2022-02-14

- 1 -

Excel PQ网爬功能的问题

我是大海,感谢关注【Excel到PowerBI】,本文较长,建议耐心阅读,如果一时时间有限,建议收藏,并及时回头阅读。

以前,在讲解用Excel的Power Query抓取网站内容的时候,主要使用Web.Page函数来提取其中的表格内容,但是,这个函数有很大的缺陷。

比如,我们通过国家统计局网站提取2021年的行政区域划分数据(http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2021/index.html),你会发现:

  • 很多说明性的内容和省份的信息都是混在一张表里的

  • 无法直接提取省份对应的链接信息

还有很多时候,网页的内容其实并不是表格,这时,就需要通过函数Web.Contents函数将网页的源代码读出来,再通过Lines.FromBinary转换成行或用文本函数或进行各种拆分、提取,才能从其中分离出所需要的内容,如果内容相对复杂,要提取数据则非常麻烦!

对网页结构代码不了解的朋友,可以先看一下以下视频,同时了解原来的数据提取方法:

- 2 -

PBI智能识别功能及其问题

现在,Power BI提供了智能识别的功能,可以提供很好的辅助,我们先用上面的例子进行操作,然后去看这个智能识别功能的原理是什么,并且学会怎么去调整和改进。

Step-01 从Web获取数据,输入网址后,即可看到按钮“使用示例添加表”:



Step-02 填选内容与智能识别、填充

在“使用示例添加表”中,在下方的表格中,填写2-3项需要提取的信息后,Power BI会自动识别出“同类”的信息进行填充:


也可以直接双击单元格进入编辑状态,此时,Power BI会提示可选的内容,按需要选择2-3项后,Power BI也会自动识别出“同类”的信息进行填充:


如果发现后续自动填充的内容不是自己想要的,那可以继续输入或选择,Power BI会随着选填的内容不断更新自动填充的内容,直到确认填充的内容是自己想要的后,单击“确定”按钮即可:

Step-03 转换数据

经过上面的填选内容和智能识别填充后,回到“导航器”里,会生成一个自定义的表,选择这个表后,单击“转换数据”,即可进入Power Query编辑器:

在PQ编辑器中,我们可以发现,前面所做的“使用示例添加表”操作,实际生成了步骤“从Html中提取的表”步骤,调用的是Html.Table函数:

同时,我们也可以看到,这个自动识别出来的内容并不全,所以,我们必须要深入了解这个数据提取方法背后的原理,然后通过适当的修改,最终提取到所有我们想要的数据。

- 3 -

Html.Table函数及其原理

Html.Table是啥?我们看看系统帮助——在Power Query里随便增加一个步骤(点编辑栏的“fx”按钮),输入公式“ =Html.Table”即可:

示例中的网页代码(去掉因直接放在函数内需要增加的多余双引号)其实比较简单,复制到文本文件里并修改扩展名为.html,用浏览器打开,代码对应的效果如下:

接下来我们看一下Html.Table后面的参数:

1、行筛选器:[RowSelector=".name"]

这个参数会决定提取结果中的“行”数,其中“.name”表示:按照属性class为name的每一个网页元素产生每一行

这段网页代码里,只有一个元素的class属性值为name,所以,最终结果只有1行。

2、列名及数据选择:{{"Name", ".name"}, {"Title", "span"}}

这个参数是一个列表,列表里每1项代表1列,每1项由“{列名,取值筛选器,取值方式}”3项内容组成

其中,第3项可以省略,省略的情况下,代表直接取网页元素中显示的值,如果要取网页元素对应的属性(如背后的链接等),在后面的例子里进行说明。

如前面的代码,最终得到结果表为:

如果我们把要提取内容的网页代码改为下面的样子:

仍然用同样的选择器,提取的结果将如下图所示:

结合网页代码、网页显示结果及提取结果,解析如下图所示:

  1. [RowSelector = ".name],确定结果表有2行

  2. {"Name",".name"},确定第1列列名为“Name”,取class为name的元素的值

  3. {"Title","span"},确定第2列列名为“Title”,取class为name元素后面的第1个span元素的值

- 4 -

实战及参考资源下载

再回到文章开始提到的提取省份名称及链接的例子,自动生成的步骤代码为:

Html.Table(      源,      {{"列 1", ".provincetr:nth-child(4) > TD"},        {"列 2", ".provincetr:nth-child(4) > TD > A:nth-child(1):nth-last-child(1)",                   each [Attributes][href]?}       },     [RowSelector=".provincetr:nth-child(4) > TD"])

其中使用到的筛选器包括以下几个:

对照网页源代码,其中的选择器对应元素如下:

再仔细观察,Power BI自动生成的代码之所以只取了部分数据,是因为我们实际上需要提取所有class为provincetr下的td项,而不区分到底取哪一个位置的,所以,我们可以直接去掉限制:nth-child(4),最终修改如下:

其中第2列取网页链接的代码中,使用了 第3个参数:each [Attributes][href],这就是对于不直接取元素对应的网页上显示信息,而是取相关属性的用法。

但是,要注意的是,目前[Attributes]后接具体属性仅支持[href]和[src],对于其他属性,不要直接加上属性名称,而是用 each [Attributes]提取所有属性后,再在Power Query中进行提取操作即可。

这个CSS选择器是不是非常强大?对于网页源码的内容简直是想怎么取就怎么取啊!!!

但是,前面的例子里,就貌似用了好多个不同的选择器,如“.name”、“span”等等,那到底还有什么其他可用的选择器?具体怎么用?这才是关键的问题!

实际上,Html.Table函数所使用的选择器,遵循W3C(万维网联盟)标准,可以在w3school里找到,为方便大家查阅,我已下载好并做成Excel文件,下载链接见文末

如果看文档,官方给的类型就有60个!

不过,不用怕,就像Power Query里有900多个函数一样,你根本就不可能需要都学会,比如,用的多的就这么6个:

一般来说先理解这几个关键的就好了,真遇到其他情况再查阅,碰到特别特别棘手的情况,再找人一起研究就是了。

Html.Table函数选择器、示例及说明文档

链接:https://pan.baidu.com/s/1A4Y4ZaO3SuUdg0e0ZKF6Gg

提取码:dhai

- 最新热门文章/合集 -

精选20篇Power Automate从基础到实战!

精选100+篇Power Query从初学到进阶!

60+篇Power BI打好数据建模及分析基础

最全391个官网Power BI自定义图表对象

150+份Power BI主题模板一次性下载

最通俗易懂Power系列视频 -

购书领60元视频券 or 直购视频送签名书

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多