尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

12 - 数据抽取 - parsel解析库

12 - 数据抽取 - parsel解析库
📅 发布时间:2026/6/20 18:57:56

文章目录

  • `parsel` 库
    • 安装
    • `Selector` 类
      • 构造方法
      • `css` 方法
      • `xpath` 方法
      • `jmespath` 方法
      • `re` 方法
      • `re_first` 方法
      • `get` 方法
      • `getall` 方法
      • `register_namespace` 方法
      • `remove_namespaces` 方法
      • `drop` 方法
      • `attrib` 方法
      • `extract` 方法
      • `extract_first` 方法
    • `SelectorList` 类
    • 处理 `HTML` 格式内容
      • 提取网页标题
      • `CSS` 选择器能力扩展
      • 循环提取子元素
      • 提取网页元素
      • 使用正则表达式
    • 处理 `XML` 格式内容

parsel库

parsel是一个针对于html、json以及xml格式解析并提取内容的 Python 库,它基于BSD授权协议。支持:

  • 为HTML和XML文档 提供基于CSS和XPath的解析支持;
  • 为JSON文档提供JMESPath表达式处理支持;
  • 提供基于正则表达式支持。

不管是HTML或是XML格式内容,都可以使用CSS或XPath表达式来选择数据。

安装

使用pip安装:

pip install parsel

使用uv安装:

uv add parsel

Selector类

parsel.Selector类用于处理HTML、JSON或XML格式输入数据的包装器,允许使用查询表达式来选择数据。对于HTML和XML输入,可以用CSS或XPath编写查询表达式,对于JSON输入,可以用JMESPath编写查询表达式。

Selector类实例就是一个选择的节点的实例化对象,所有的方法都针对于该节点处理其子节点。当我们在传入字符串解析的时候,这时候生成的可以看做是一个根节点。

⚠️注意

parsel.Selector对XPath的支持基于lxml库; 对JSON的支持基于JMESPath库。

构造方法

函数原型:

__init__( self, text: Optional[str] = None, type: Optional[str] = None, body: bytes = b"", encoding: str = "utf-8", namespaces: Optional[Mapping[str, str]] = None, root: Optional[Any] = _NOT_SET, base_url: Optional[str] = None, _expr: Optional[str] = None, huge_tree: bool = LXML_SUPPORTS_HUGE_TREE, ) -> None

其中:

  • text:str类型,【可选】。 待处理的文本
  • type:str类型,【可选】。定义选择器类型。可选的值html、json或xml其中之一;默认为html。
  • body:bytes对象。内容体。它可以与encoding参数一起使用,而不是与text参数一起使用。
  • encoding:str类型,内容编码类型,默认为utf-8。
  • namespaces:Map[str,str]对象,【可选】,命名空间集合, 默认为None,如果不设定,则使用_default_namespaces。
  • root:Any,【可选】, 默认为_NOT_SET。
  • base_url:str类型,【可选】。允许为文档设置URL。这在查找具有相对路径的外部实体时是需要的。
  • huge_tree:bool类型。控制lxml/libxml2特性,该特性禁止解析某些大文档,以防止可能的内存耗尽。如果安装的lxml版本支持该参数,默认情况下该参数为True,这将禁用允许解析此类文档的保护。如果要启用保护,将其设置为False。

css方法

根据给定的CSS查询表达式查找本Selector下所有符合条件的节点并返回。函数原型:

css(self: _SelectorType, query: str) -> SelectorList[_SelectorType]

其中:

  • query:str类型,CSS格式查询表达式。

返回结果是SelectorList对象实例;包含所有查找的结果。

该方法内部处理实际上是将css查询表达式转换为xpath的查询表达式,然后使用cssselect库和运行xpath方法。

xpath方法

根据给定的XPath格式查询表达式查询本Selector下符合条件的所有节点并返回。函数原型:

xpath( self: _SelectorType, query: str, namespaces: Optional[Mapping[str, str]] = None, **kwargs: Any, ) -> SelectorList[_SelectorType]

其中:

  • query:str类型,XPath格式查询表达式;
  • namespaces:Map[str,str]对象,【可选】,命名空间集合, 默认为None;
  • kwargs:dict类型。 其他可选的字典参数。

返回结果是SelectorList对象实例;包含所有查找的结果。

jmespath方法

根据给定的JMESPath格式的查询本Selector下表达式查询符合条件的所有节点并返回。函数原型:

jmespath( self: _SelectorType, query: str, **kwargs: Any, ) -> SelectorList[_SelectorType]

其中:

  • query:str类型,JEMSPath格式查询表达式;
  • kwargs:dict类型。 其他可选的字典参数。

返回结果是SelectorList对象实例;包含所有查找的结果。

re方法

根据给定的正则表达式查询本Selector下所有符合条件的节点并返回所有结果。函数原型:

re(self, regex: Union[str, Pattern[str]], replace_entities: bool = True) -> List[str]

其中:

  • regex:str类型或者Pattern[str]对象,正则表达式字符串或者正则表达式模式;
  • replace_entities:bool类型。默认值为True。 默认除了歧义字符(如&、<等)所有的字符实体引用都会被对应的字符替换;如果不想替换,则设置为False。

返回结果是list[str]即所有匹配到的字符串列表。

re_first方法

与re类似,只是re返回的是所有匹配的字符串,而re_first返回第一条匹配的字符串。函数原型:

re_first( self, regex: Union[str, Pattern[str]], default: Optional[str] = None, replace_entities: bool = True, ) -> Optional[str]

其中:

  • regex:str类型或者Pattern[str]对象,正则表达式字符串或者正则表达式模式;
  • default:str类型,可选,默认为None;
  • replace_entities:bool类型。默认值为True。 默认除了歧义字符(如&、<等)所有的字符实体引用都会被对应的字符替换;如果不想替换,则设置为False。

get方法

序列化并返回匹配的节点。对于HTML和XML,返回的是字符串。函数原型:

get(self) -> Any

getall方法

序列化并返回本Selector下包含的所有元素构成的列表。函数原型:

getall(self) -> List[str]

register_namespace方法

注册给定的命名空间,以便在Selector中使用。如果不注册名称空间,就不能从非标准名称空间中选择或提取数据。函数原型:

register_namespace(self, prefix: str, uri: str) -> None

其中:

  • prefix:str类型。命名空间键名;
  • uri:str类型。命名空间链接地址。

remove_namespaces方法

删除所有的命名空间。允许使用无名称空间的XPath遍历文档。函数原型:

remove_namespaces(self) -> None

drop方法

从本Selector所属父类节点中删除本节点。函数原型:

drop(self) -> None

attrib方法

返回本Selector的所有属性。函数原型:

attrib(self) -> Dict[str, str]

返回的是一个键值字典,其中,键为属性名,值为属性值。

extract方法

等同于getall方法。

extract_first方法

等同于get方法

SelectorList类

SelectorList类是选择节点的容器,由选中的节点(看作是每个Selector构成)。提供的方法和Selector一直,只是它处理的列表中的所有节点,而SelectorList是处理自己的节点及其子节点。

处理HTML格式内容

现在我们假定有以下html文本可供使用:

<html> <head> <base href='http://example.com/' /> <title>Example website</title> </head> <body> <div id='images'> <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a> <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a> <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a> <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a> <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a> </div> </body> </html>

对于HTML格式数据,我们使用css和xpath表达式来查询数据。首先导入Selector:

from parsel import Selector

然后解析字符串:

html_selector = Selector(content)

提取网页标题

从现在开始,开始来逐一举例如何使用parsel操作Html格式文档。

selector2 = selector.css('title::text') print(selector2.getall())

上面的代码使用css方法解析指定的元素title::text;输出:

['Example website']

下面使用xpath方法来获取网页标题:

selector3 = selector.xpath('//title/text()') print(selector3.getall())

输出:

['Example website']

CSS选择器能力扩展

按照W3C标准,CSS选择器是不支持提取文本节点和节点属性的,但是parsel扩展了属性器:

  • 从节点中取出文本,使用::text;支持通配符,如*::text。
  • 取出节点属性值,使用::attr(name)。
print(selector.css("title::text").extract()) print(selector.css("a::attr('href')").extract())

输出:

['Example website'] ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

循环提取子元素

选择器的xpath和css方法返回的是一个同类型的选择节点列表,所以可以通过循环的方式读取子节点:

links = selector.xpath('//a[contains(@href, "image")]') for index, link in enumerate(links): args = (index, link.xpath('@href').get(), link.xpath('img/@src').get()) print('Link number %d points to url %r and image %r' % args)

输出:

Link number 0 points to url 'image1.html' and image 'image1_thumb.jpg' Link number 1 points to url 'image2.html' and image 'image2_thumb.jpg' Link number 2 points to url 'image3.html' and image 'image3_thumb.jpg' Link number 3 points to url 'image4.html' and image 'image4_thumb.jpg' Link number 4 points to url 'image5.html' and image 'image5_thumb.jpg'

提取网页元素

首先示例使用css方法提取:

selector1 = selector.css("div[id='images'] a::attr(href)") print(selector1.getall())

输出:

['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

然后使用xpath方法来提取:

selector2 = selector.xpath('//div[@id="images"]/a/@href') print(selector2.getall())

输出:

['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

最后我们使用混合模式来提取:

selector1 = selector.css("div[id='images']").xpath("//a/@href") print(selector1.getall())

输出:

['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

使用正则表达式

parsel.Selector提供的re和re_first方法支持正则表达式:

print(selector.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)'))

输出:

['My image 1 ', 'My image 2 ', 'My image 3 ', 'My image 4 ', 'My image 5 ']

处理XML格式内容

首先,我们准备一段文本,如下:

<bookstore> <book category="科幻"> <title>Python 库使用</title> <author>胡伯</author> <price>68.00</price> </book> <book category="经典"> <title>一起学习网络爬虫</title> <author>张磊</author> <price>39.50</price> </book> </bookstore>

然后我们提取节点:

from parsel import Selector xml_content = """ <bookstore> <book category="科幻"> <title>Python 库使用</title> <author>胡伯</author> <price>68.00</price> </book> <book category="经典"> <title>一起学习网络爬虫</title> <author>张磊</author> <price>39.50</price> </book> </bookstore> """ # 创建Selector对象 selector = Selector(text=xml_content,type="xml") selector1 = selector.xpath("//bookstore/book/title/text()") print(selector1.getall())

输出:

['Python 库使用', '一起学习网络爬虫']

相关新闻

  • Lua 调试(Debug)
  • 家长们都应该了解这些知识,保护孩子视力太重要了
  • Math - 中心化,标准化和归一化

最新新闻

  • GPT-4o架构解析:低延迟语音与原生多模态统一建模
  • xray被动扫描器实战指南:从安装配置到精准漏洞挖掘
  • 2026合肥理工学校官方最全招生简章|办学详情、管理模式、升学数据、报名入口全公布 - 教育为先
  • 如何获得赞助:Instagram、活动赞助及其他赞助
  • 鸣潮自动化工具终极指南:基于YOLOv8图像识别的智能辅助解决方案
  • 2026帝王宫海鲜加工饭店排行榜:内行推荐这5家 - 官方资讯

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号