获取css selector,使用CSS Selector进行网抓

Power BI Desktop 5月更新来了,在网抓方面增加了一个新功能———使用示例提取表。

使用前需在设置-预览功能中,勾选"新的通过Web体验"。

css1.png

该功能类似于智能填充以及添加示例中的列,允许用户手动输入目标数据,并根据输入内容智能分析转换规则,获取到网页中具有同样样式的其他数据。

但从初步体验来看,明显还不够智能,测试了几个稍微复杂点的网页都抓不到数据,所以不应太过依赖可视化界面操作。

该功能的背后则是5月新增的两个函数Web.BrowserContents以及Html.Table。

其中前者用于获取网页的Html源码,初步探究其作用相当于Text.FromBinary和Web.Contents的组合,第二参数的用法还需进一步测试。后者能够返回包含指定CSS Selector所有内容的表,是实现CSS Selector网抓的核心函数。

这两个函数目前只能在PBID中使用,预计在一个月内会更新到Excel中的Power Query。

CSS Selector是用于定位网页中元素的一种常见方法,其他的方法还有Xpath等。

如果把网页比作房子,Html相当于房子的骨架,用于设定网页的结构和内容;CSS是层叠样式表,用于控制网页中的样式,相当于房子的外观,比如墙刷什么颜色,地板用什么材质等等;JS相当于家电,比如空调、洗衣机等等,用于给房子增加一些功能。

在Html.Table出现之前,如果要抓的网页为非结构化数据,即不包含表、Json或Xml,要定位到某个值只能将获取网页源代码后当成文本处理,既复杂又不准确。

而有了这个函数,就能够根据网页中特定的样式,定位到指定位置的值。

用法主要有两种:

1、抓取不同网页中同一位置的值

比如已知商品的URL,要批量抓取商品售价。

css2.png

实现如下的效果:

css3.png

对于不同网页中的不同商品,虽然售价的数字不同,但是使用的颜色、字体等样式都是相同的,所以可以根据用来描述售价的CSS Selector来定位,从而抓取不同网页中同一位置的值。

首先以iPhone X的网页为例,URL为https://item.jd.com/5089253.html,在浏览器中右击红色的售价数字,选择检查,调出调试窗口。窗口中自动定位并高亮了所选位置的源码,右击源码,选择Copy-Copy selector。

GIF.gif

然后进入查询编辑器构建函数,Web.BrowserContents("http://item.jd.com/5089253.html")获取网页源代码;Html.Table第一参数为源代码,第二参数为大的list中套小list,每一个小list表示一列,包含列名及CSS Selector,把刚才复制的内容粘贴进去即可得到单个网页中的售价。

GIF-1.gif

let

源 = Html.Table(Web.BrowserContents("https://item.jd.com/5089253.html"),

{

{"售价",

"body > div:nth-child(9) > div > div.itemInfo-wrap > div.summary.summary-first > div > div.summary-price.J-summary-price > div.dd > span.p-price > span.price.J-p-5089253"

}

})

in

由于其他网页中的售价也是同样的样式,所以同样的公式应该就能批量获取到所有网页中的售价。但是如果真的这么做,会发现其他网址中的售价都为空,结果不正确。

再回头来分析下刚才复制的CSS Selector,内容为:

body > div:nth-child(9) > div > div.itemInfo-wrap > div.summary.summary-first > div > div.summary-price.J-summary-price > div.dd > span.p-price > span.price.J-p-5089253

结构大致为A.a > B.b > C.c,具有多个节点,表示具有a属性的A标签下具有b属性的B标签下具有c属性的C标签。

再复制其他网页中的CSS Selector进行对比,发现前面都是一样的,只有最后一个节点的span.price.J-p-5089253不同。

而在前一个节点span.p-price下具有两个节点,一个用来描述人民币符号,另一个用来描述数字。

css6.png

所以可以把最后一个节点中不同的属性删除,写成span.price,同样可以获取到数字"8316"。也可以直接把最后一个节点删除,仅定位前一个节点,获取结果为"¥8316"。

复制的完整CSS Selector非常长,而填入函数中的参数通常可以简化。

比如在这个网页中,仅用span.p-price这一个节点足以定位,只需要确保描述的唯一性即可,代码为= Table.AddColumn(源, "售价", each Html.Table(Web.BrowserContents([网址]),{{"售价","span.p-price"}})[售价]{0})

2、抓取同一网页中不同位置的同属性值

比如在iPhone X的网页中,具有公开版、原厂延保版、双网通版等多个版本,这些值使用了同样的样式,则可使用CSS Selector批量抓取。

首先选择其中任一版本复制CSS Selector,比如复制"蓝牙二级套装",内容为#choose-attr-2 > div.dd > div:nth-child(5) > a。

注意不要选择网页中默认框选的版本,因为样式不同。

可多复制几个进行对比,发现只有倒数第二个节点不同。

div:nth-child(5),表示父元素div中的第5个子元素,现在是要获取所有子元素,把该节点中的属性删除即可,改为#choose-attr-2 > div.dd > div > a。

代码为= Html.Table(Web.BrowserContents("https://item.jd.com/5089253.html"),{{"版本","#choose-attr-2 > div.dd > div > a"}})

css7.png

有关CSS Selector的更多技巧可自行百度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值