当前位置: 首页 > news >正文

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 库使用', '一起学习网络爬虫']
http://www.jsqmd.com/news/167459/

相关文章:

  • 选择合适发布时间提升技术文章曝光量
  • 孩子近视增长快,有什么方法可以帮助孩子防控近视吗?
  • PyTorch基础【笔记向,本人学习中】
  • Lua 调试(Debug)
  • 2025多学科优化软件榜单
  • 在标题、首段、H2标签中合理分布目标关键词
  • 家长们都应该了解这些知识,保护孩子视力太重要了
  • SSH隧道转发Jupyter端口实现在Miniconda中调试代码
  • 2025年12月高温煅烧窑,固废煅烧窑,连续式煅烧窑厂家推荐:行业权威盘点与品质红榜发布 - 品牌鉴赏师
  • 使用Conda环境分离开发、测试与生产AI流程
  • CSS3 圆角
  • 利用RSS订阅扩大技术内容影响力范围
  • Math - 中心化,标准化和归一化
  • 西安交大突破:视觉语言模型功能词忽略提升鲁棒性
  • 10 数据抽取 - 文档类型检测
  • omnet++ manual
  • 写一个简单的Linux驱动程序
  • Elasticsearch 与 PostgreSQL 集成:关系型数据库的搜索增强
  • Miniconda-Python3.10镜像支持AutoGPT等自主代理运行
  • 苹果突破:AI实现自主高效文本生成方式革新
  • 2025最新云南节能评估报告服务品牌top5榜单公布,服务覆盖昆明/曲靖/文山/保山/昭通等地优质公司专业评测及选择指南,权威榜单助力企业项目高效合规 - 全局中转站
  • 设置系列专栏:如‘30天掌握AI开发环境搭建’
  • 华为OD机试 - 文件存储系统的排序 - 深度优先搜索dfs(Java 双机位C卷 200分)
  • 露天游泳池涂料必须满足的三大硬性指标:耐候、耐晒、耐水
  • 使用Miniconda环境运行T5模型生成文本内容
  • Adams中机械系统动态质心实时显示与质心轨迹导出
  • SSH远程访问Miniconda-Python3.10容器进行模型训练
  • Docker run命令启动Miniconda-Python3.10运行PyTorch示例
  • 利用GitHub托管代码示例增强技术文章可信度
  • 内部链接策略:用锚文本串联相关内容提升停留时间