- 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转换成行或用文本函数或进行各种拆分、提取,才能从其中分离出所需要的内容,如果内容相对复杂,要提取数据则非常麻烦!
对网页结构代码不了解的朋友,可以先看一下以下视频,同时了解原来的数据提取方法:http://mpvideo.qpic.cn/0bf2lyaggaaai4amjoi525qvaxwdmnpaayya.f10002.mp4?dis_k=acf74b6c88c7360d959d4b7b9c937c3b&dis_t=1646024121&vid=wxv_2008920665164185601&format_id=10002&support_redirect=0&mmversion=false
- 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项可以省略,省略的情况下,代表直接取网页元素中显示的值,如果要取网页元素对应的属性(如背后的链接等),在后面的例子里进行说明。
如前面的代码,最终得到结果表为:
如果我们把要提取内容的网页代码改为下面的样子:
仍然用同样的选择器,提取的结果将如下图所示:
结合网页代码、网页显示结果及提取结果,解析如下图所示:
- 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
本文分享自 Excel到PowerBI 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!