- 订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+
python项目实战
Python编程基础教程系列(零基础小白搬砖逆袭)
- 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费专栏,可报销(名额有限,先到先得)。
- 作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度博客新星top100入围,荣获多家平台专家称号。
最近更新
〖Python网络爬虫实战⑮〗- pyquery的使用
🌟 上节回顾
前文我们学习了 lxml 使用 XPath 和 pyquery 使用 CSS Selector 来提取页面内容的方法,不论是 XPath 还是 CSS Selector,对于绝大多数的内容提取都足够了,大家可以选择适合自己的库来做内容提取。
⭐️网页解析利器parsel
我们有时候觉得 XPath 写起来比较方便,有时候觉得 CSS Selector 写起来比较方便,能不能二者结合起来使用呢?我平时也喜欢用这个库,功能太强大了。大家可以根据自己的个人习惯,选择一个解析库。
这里我们就介绍另一个解析库,叫做 parsel。
🌟 parsel简介
Parsel是一个用于解析JSON数据的Python库。它提供了一个简单易用的API,可以轻松地从JSON文件或字符串中解析数据。可以对 HTML 和 XML 进行解析,并支持使用 XPath 和 CSS Selector 对内容进行提取和修改,同时它还融合了正则表达式提取的功能。功能灵活而又强大。
🌟 准备工作
在本节开始之前,请确保已经安装好了 parsel 库,如尚未安装,可以使用 pip3 进行安装即可:
pip3 install parsel
🌟 初始化
我们在这里,和前面一样,要对网页内容进行初始化。这里,我还是以前面的内容来讲解parsel。
html = '''
<div>
<ul>
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
接着,一般我们会用 parsel 的 Selector 这个类来声明一个 Selector 对象,写法如下:
import parsel
selector = parsel.Selector(text=html)
有了 Selector 对象之后,我们可以使用 css 和 xpath 方法分别传入 CSS Selector 和 XPath 进行内容的提取,比如这里我们提取 class 包含 item-0 的节点,写法如下:
items = selector.css('.item-0')
print(len(items), type(items), items)
items2 = selector.xpath('//li[contains(@class, "item-0")]')
print(len(items2), type(items), items2)
css
方法用于选择元素的 CSS 样式,xpath
方法用于选择元素的 XPath 表达式。在上面的示例中,我们使用 css
方法选择了所有的列表项,并使用 xpath
方法选择了所有包含 .item-0
类的列表项。
len()
方法用于获取列表项的数量,type()
方法用于获取列表项的类型,items
变量用于存储选择的列表项。
我们这里用了两种方法来表达的,我们会发现CSS和Xpath在这里都可以使用。
🌟 提取文本
items = selector.css('.item-0')
for item in items:
text = item.xpath('.//text()').get()
print(text)
这里我们遍历了 items 变量,赋值为 item,那么这里 item 又变成了一个 Selector 对象,那么此时我们又可以调用其 css 或 xpath 方法进行内容提取了,比如这里我们就用 .//text()
这个 XPath 写法提取了当前节点的所有内容。
上面的语法,我们还可以这样写。
result = selector.xpath('//li[contains(@class, "item-0")]//text()').getall()
print(result)
这里我们使用 //li[contains(@class, "item-0")]//text()
选取了所有 class 包含 item-0 的 li 节点的文本内容。
如果要提取 SelectorList 里面对应的结果,可以使用 get 或 getall 方法,前者会获取第一个 Selector 对象里面的内容,后者会依次获取每个 Selector 对象对应的结果。
另外上述案例中,xpath 方法改写成 css 方法,可以这么实现:
result = selector.css('.item-0 *::text').getall()
print(result)
这里*
用来提取所有子节点(包括纯文本节点),提取文本需要再加上::text
,最终的运行结果是一样的。
🌟 提取属性
提取属性呢,也很简单。我们这里用一行代码,你就明白了。
result = selector.css('.item-0 a::attr(href)').get()
print(result)
result = selector.xpath('//li/a/@href').get()
print(result)
我们这里取a 节点的 href 属性,对于 CSS Selector,选取属性需要加 ::attr()
并传入对应的属性名称来选取,对于 XPath,直接用 /@
再加属性名称即可选取即可。是不是很简单。
🌟 正则提取
除了常用的 css 和 xpath 方法,Selector 对象还提供了正则表达式提取方法,这个和我们正则表达式一样,我就不多解释。
title = selector.re('写正则表达式')
后面,我们也会有一次实战讲解的文章。
🌟 总结
parsel 是一个融合了 XPath、CSS Selector 和正则表达式的提取库,功能强大又灵活,建议好好学习一下。我们下一篇,就讲解一篇关于parsel实战的博客,我们会把这三种方法都用到,让大家直观的感受到parsel功能的强大。