> 文章列表 > 〖Python网络爬虫实战⑯〗- 网页解析利器parsel

〖Python网络爬虫实战⑯〗- 网页解析利器parsel

〖Python网络爬虫实战⑯〗- 网页解析利器parsel

  • 订阅:新手可以订阅我的其他专栏。免费阶段订阅量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功能的强大。

服装搭配