news 2026/4/28 20:16:49

12 - 数据抽取 - parsel解析库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
12 - 数据抽取 - parsel解析库

文章目录

  • `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是一个针对于htmljson以及xml格式解析并提取内容的 Python 库,它基于BSD授权协议。支持:

  • HTMLXML文档 提供基于CSSXPath的解析支持;
  • JSON文档提供JMESPath表达式处理支持;
  • 提供基于正则表达式支持。

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

安装

使用pip安装:

pip install parsel

使用uv安装:

uv add parsel

Selector

parsel.Selector类用于处理HTMLJSONXML格式输入数据的包装器,允许使用查询表达式来选择数据。对于HTMLXML输入,可以用CSSXPath编写查询表达式,对于JSON输入,可以用JMESPath编写查询表达式。

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

⚠️注意

parsel.SelectorXPath的支持基于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

其中:

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

css方法

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

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

其中:

  • querystr类型,CSS格式查询表达式。

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

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

xpath方法

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

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

其中:

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

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

jmespath方法

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

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

其中:

  • querystr类型,JEMSPath格式查询表达式;
  • kwargsdict类型。 其他可选的字典参数。

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

re方法

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

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

其中:

  • regexstr类型或者Pattern[str]对象,正则表达式字符串或者正则表达式模式;
  • replace_entitiesbool类型。默认值为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]

其中:

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

get方法

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

get(self) -> Any

getall方法

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

getall(self) -> List[str]

register_namespace方法

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

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

其中:

  • prefixstr类型。命名空间键名;
  • uristr类型。命名空间链接地址。

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格式数据,我们使用cssxpath表达式来查询数据。首先导入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']

循环提取子元素

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

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提供的rere_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 库使用', '一起学习网络爬虫']
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 15:06:24

Jupyter Notebook导出PDF报告时的字体兼容性设置

Jupyter Notebook导出PDF报告时的字体兼容性设置 在数据科学和人工智能项目中&#xff0c;我们常常需要将实验过程、分析结果与可视化图表整合成一份结构清晰的技术报告。Jupyter Notebook 凭借其“代码文档”一体化的交互式特性&#xff0c;已成为科研人员和工程师首选的开发环…

作者头像 李华
网站建设 2026/4/28 10:54:59

PHP EOF (Heredoc)

PHP EOF (Heredoc) 引言 在PHP编程中,EOF(End Of File)语句提供了一种简洁的方式来定义多行字符串。这种语法特别适用于定义长字符串、配置文件、模板或任何需要包含多行文本的场景。EOF语句通过使用特殊的标记来定义字符串的开始和结束,从而使得代码更加清晰和易于阅读。…

作者头像 李华
网站建设 2026/4/24 22:16:36

JSP 连接数据库

JSP 连接数据库 引言 JavaServer Pages(JSP)是一种动态网页技术,它允许开发人员使用Java代码来创建交互式网页。在Web开发中,数据库是存储和管理数据的重要工具。JSP与数据库的连接是实现动态网页与数据库交互的关键。本文将详细介绍JSP连接数据库的方法、步骤以及注意事…

作者头像 李华
网站建设 2026/4/25 8:05:44

Spring-AI 结合自定义 mcp server 实现飞书智能机器人

1. 简介 本文主要介绍基于 spring ai 自定义搭建 mcp 服务端和客户端&#xff0c;主要场景是&#xff1a; 基于本地的mcp服务让飞书机器人跟场景回答不同的问题 实现效果如下 最后附了源码链接.整体代码非常简单&#xff0c;容易上手。 2.概念 2.1 什么是 AI MCP&#xff…

作者头像 李华
网站建设 2026/4/19 10:46:36

安装包管理的艺术:在Miniconda中精准控制Python依赖

安装包管理的艺术&#xff1a;在Miniconda中精准控制Python依赖 如今&#xff0c;一个数据科学家早上刚跑通的模型&#xff0c;下午却在同事机器上“无法导入模块”&#xff1b;一位AI工程师在本地训练完美的代码&#xff0c;部署到服务器时因CUDA版本不匹配而崩溃。这类问题每…

作者头像 李华
网站建设 2026/4/20 10:27:14

SEO关键词布局:如何让‘pytorch安装教程gpu’排名靠前

SEO关键词布局&#xff1a;如何让“pytorch安装教程gpu”排名靠前 在人工智能学习热潮席卷全球的今天&#xff0c;越来越多开发者和学生开始尝试搭建自己的深度学习环境。而面对的第一个现实问题往往是&#xff1a;如何在本地或云端顺利安装支持 GPU 的 PyTorch&#xff1f; 这…

作者头像 李华