python正则表提取第一个逗号前的内容_爬虫如何正确从网页中提取伪元素?

本文探讨了如何从网页中提取伪元素,尤其是当内容不在HTML或Ajax请求中时。提到XPath无法处理伪元素,而需要结合CSS选择器和JavaScript。通过示例展示了使用Selenium执行JavaScript来获取伪元素内容的方法,并提醒提取内容时需要注意去除外层的双引号。
摘要由CSDN通过智能技术生成

阅读本文大概需要 2 分钟。

我们来看一个网页,大家想想使用 XPath 怎么抓取。

25e12f0582825e523266e438719f1b49.png

可以看到,在源代码里面没有请抓取我!这段文字。难道这个网页是异步加载?我们现在来看一下网页的请求:

aa59b3f03558271efba3202cd73a468b.png

网页也没有发起任何的Ajax 请求。那么,这段文字是从哪里来的?

我们来看一下这个网页对应的 HTML:

3d66cf9a2dea6d402e2d14eb8cb725e1.png

整个 HTML 里面,甚至连 JavaScript 都没有。那么这段文字是哪里来的呢?

有点经验的同学,可能会想到看一下这个example.css文件,其内容如下:

1594e68c7a5a4904d3839756db124d8c.png

没错,文字确实在这里面。其中::after,我们称之为伪元素(Pseudo-element)[1]

对于伪元素里面的文字,应该如何提取呢?当然,你可以使用正则表达式来提取。不过我们今天不准备讲这个。

XPath 没有办法提取伪元素,因为 XPath 只能提取 Dom 树中的内容,但是伪元素是不属于 Dom 树的,因此无法提取。要提取伪元素,需要使用 CSS 选择器。

由于网页的 HTML 与 CSS 是分开的。如果我们使用 requests 或者 Scrapy,只能单独拿到 HTML 和 CSS。单独拿到 HTML 没有任何作用,因为数据根本不在里面。单独拿到 CSS,虽然有数据,但如果不用正则表达式的话,里面的数据拿不出来。所以 BeautifulSoup4的 CSS 选择器也没有什么作用。所以我们需要把 CSS 和 HTML 放到一起来渲染,然后再使用JavaScript 的 CSS 选择器找到需要提取的内容。

首先我们来看一下,为了提取这个伪元素的值,我们需要下面这段Js 代码:

window.getComputedStyle(document.querySelector('.fake_element'),':after').getPropertyValue('content')

其中,ducument.querySelector的第一个参数.fake_element就表示值为fake_elementclass 属性。第二个参数就是伪元素:after。运行效果如下图所示:

5bb6e0518db2ddeeb32efc2d382a9b62.png

为了能够运行这段 JavaScript,我们需要使用模拟浏览器,无论是 Selenium 还是 Puppeteer 都可以。这里以 Selenium 为例。

在 Selenium 要执行 Js,需要使用driver.execute_script()方法,代码如下:

adfdead84a8fa6392b3cf696518d12b5.png

提取出来的内容最外层会包上一对双引号,拿到以后移除外侧的双引号,就是我们在网页上看到的内容了。

参考资料

[1]

伪元素(Pseudo-element): https://developer.mozilla.org/zh-CN/docs/Web/CSS/Pseudo-elements

推荐阅读

1

因为"扫一扫"功能,支付宝竟被起诉了!

2

5 款最佳最牛代码比较神器

3

微信第 1 行代码曝光!

4‍‍

微软最强 Python 自动化工具开源了!不用写一行代码!

好文和朋友一起看~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值