news 2026/9/9 19:10:37

Scrapling 自带的 TextHandler 与 AttributesHandler 自定义类型如何在自己的项目中使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Scrapling 自带的 TextHandler 与 AttributesHandler 自定义类型如何在自己的项目中使用

Scrapling 自带的 TextHandler 与 AttributesHandler 自定义类型如何在自己的项目中使用

【免费下载链接】Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling

假设你的项目里已经用 Scrapling 解析页面,或者你单纯想要两个东西:一个比标准str多带re()json()clean()等方法的字符串类型,以及一个只读、带search_values()按值检索的映射类型。Scrapling 把这两个实现放在了核心包里,官方文档明确建议:把它们导入到你自己的代码中复用,比复制它们的源码更好。前提是 Python 3.10 或更高,并按基础方式安装:

pip install scrapling

基础安装包含解析引擎及其依赖,这两个类型位于scrapling.core中,属于基础包的一部分,不需要安装fetchers等可选依赖。

导入方式

官方文档给出的导入路径是:

from scrapling.core.custom_types import TextHandler, AttributesHandler

另外,包顶层也直接导出了这两个类(惰性导入定义在 scrapling/init.py 中),所以文档解析章节里用的这种写法同样有效:

from scrapling import TextHandler

三个类都可单独导入:TextHandlerTextHandlersList的版本)、AttributesHandler,完整签名参考 Custom Types API Reference。

在普通代码中使用 TextHandler

TextHandler是 Pythonstr的子类,所有标准字符串操作都可用,同时额外提供若干方法。官方文档中给出的最小用法(来自 Using Scrapling's custom types):

from scrapling.core.custom_types import TextHandler somestring = TextHandler('{}') somestring.json()

如果你需要在代码里判断类型,文档建议使用 Python 内置的issubclass函数,而不是直接比较type

在 Scrapling 解析结果中,re/re_first的行为与直接构造的TextHandler一致,Parsing main classes 里给出了可独立运行的示例:

from scrapling import TextHandler test_string = TextHandler('hi there') # 注意两个空格 test_string.re('hi there') # 无匹配 test_string.re('hi there', clean_match=True) # ['hi there'] test_string2 = TextHandler('Oh, Hi Mark') test_string2.re_first('oh, hi Mark') # 无匹配 test_string2.re_first('oh, hi Mark', case_sensitive=False) # 'Oh, Hi Mark' # 参数可以混用 test_string.re('hi there', clean_match=True, case_sensitive=False) # ['hi There']

re的可选参数含义(与解析器中同名方法一致):replace_entities默认开启,会把 HTML 实体替换为对应字符;clean_match默认关闭,开启后匹配前忽略空白与连续空格;case_sensitive默认开启,关闭后正则忽略大小写;check_match=True时只做布尔判断,返回是否匹配。

除正则外还有几个可直接复用的方法:

TextHandler('\n wonderful idea, \reh?').clean() # 'wonderful idea, eh?' TextHandler('acb').sort() # 'abc' TextHandler('acb').sort(reverse=True) # 'cba'

clean()接受remove_entities参数,传入后同时把 HTML 实体替换为对应字符。.json()方法在内容可以序列化为 JSON 时返回 JSON 对象,否则抛出错误;文档示例(解析<script>内的 JSON 文本):

>>> page.css('#page-data::text').get().json() {'lastUpdated': '2024-09-22T10:30:00Z', 'totalProducts': 3}

另外,所有会返回字符串的操作(切片、splitreplacestrip等)返回的仍然是TextHandler,所以方法可以链式调用。

在普通代码中使用 AttributesHandler

AttributesHandlercollections.abc.Mapping的子类,官方用它替代标准dict来存储元素属性。构造方式支持字典参数或关键字参数两种(来自官方文档):

from scrapling.core.custom_types import AttributesHandler somedict_1 = AttributesHandler({'a': 1}) somedict_2 = AttributesHandler(a=1)

它的核心特征是只读

  • 传入的字符串值会被自动包装成TextHandler,因此可以attrs['a'].clean()这样继续调用字符串扩展方法;
  • 标准dict的读取操作(get__getitem__in、迭代、len等)全部可用,任何试图修改数据的操作不可用;
  • 内部数据通过_data属性访问,其类型是types.MappingProxyType,同样是只读的,官方注明它比直接暴露Mapping快一点。

它比字典多出的两个能力:

# 1. search_values:按值查找,返回匹配项生成器 for i in attrs.search_values('product'): # 精确匹配 print(i) for i in attrs.search_values('page', partial=True): # 部分匹配 print(i)

文档给出的真实页面示例中,page.find('script').attrib.search_values('page-data')输出{'id': 'page-data'}。注意它是生成器,直接放进布尔判断永远为真,需要时先list(...)

# 2. json_string 属性:属性可 JSON 序列化时返回 JSON 字节串,否则抛错 >>> page.find('script').attrib.json_string b'{"id":"page-data","type":"application/json"}'

如果需要修改数据,官方给出的唯一路径是先转换成标准字典:

mutable = dict(attrs) # 之后在 mutable 上修改

验证你的用法是否正确

跑完上面的示例后,可以用文档展示过的方式确认类型与行为:

from scrapling.core.custom_types import TextHandler, AttributesHandler t = TextHandler('acb') issubclass(type(t), str) # TextHandler 是 str 的子类 t.sort() # 'abc',返回值仍是 TextHandler,可继续链式调用 a = AttributesHandler({'id': 'page-data'}) type(a).__name__ # 'AttributesHandler',文档中的验证方式 a['id'] # 'page-data' 'a.get' in dir(a) # 具备 dict 的 get 方法 dict(a) # 需要修改时,先转成 dict

判定标准:字符串方法链不中断、json()对可解析的 JSON 文本返回对象而非字符串、AttributesHandler的读取操作与字典一致且_data不可写,就说明类型在项目中已按预期工作。仓库中的 tests/parser/test_attributes_handler.py 展示了更完整的属性访问断言,实现细节见 scrapling/core/custom_types.py。

限制

  • AttributesHandler是只读的,任何写操作都必须先dict()转换,没有原地修改接口。
  • json()json_string只在内容可 JSON 序列化时工作,否则抛错,而不是返回默认值。
  • 文档承诺会持续给TextHandler等新方法,具体方法集以当前版本的 API Reference 为准。

【免费下载链接】Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 19:09:26

Java实现电力电表376.1/645协议解析与数据采集实战

简介&#xff1a;376.1协议&#xff08;ANSI C12.18-2004&#xff09;是电力行业自动抄表与高级计量基础设施中的常见通信标准&#xff0c;这套Java实现资源包面向电力系统软件开发人员&#xff0c;可帮助解决智能电表数据采集、远程控制与协议报文的解析处理难题。资源包共107…

作者头像 李华
网站建设 2026/9/9 19:08:17

C语言编译链接四阶段全解析:从源码到可执行文件

开头先问个问题&#xff1a;你写C语言多久了&#xff1f;如果是刚学完语法、能跑通几个小练习的阶段&#xff0c;那这篇文章可能正好是你需要的。如果已经写了三五年&#xff0c;每次都用一条gcc hello.c -o hello搞定一切&#xff0c;我建议你也花十分钟把这条命令背后的四段旅…

作者头像 李华
网站建设 2026/9/9 19:06:44

基于粒子群双层优化的配电网光储选址定容方法

配电网做分布式电源规划的朋友&#xff0c;应该都对“选址定容”这四个字有切身体会。同样一笔光伏和储能投资&#xff0c;装在哪、装多大、储能怎么充放&#xff0c;最终的经济性和系统运行效果完全可能天差地别。装得不好&#xff0c;网损不降反升&#xff0c;末端电压被光伏…

作者头像 李华
网站建设 2026/9/9 19:05:05

SAP SD主数据全解析:客户、物料、定价、信用及批导实战

很多刚接触SAP SD模块的朋友&#xff0c;第一个被绕晕的地方往往不是销售订单怎么建&#xff0c;而是“主数据”这三个字。我在做项目时带过不少新顾问和内部关键用户&#xff0c;发现一个普遍规律&#xff1a;凡是销售订单、交货单、开票流程中反复出问题的&#xff0c;追根溯…

作者头像 李华
网站建设 2026/9/9 19:03:39

Python魔法方法完全指南:从__init__到__slots__的进阶之路

1. 魔法方法到底是什么&#xff0c;以及为什么值得花时间掌握在Python里写代码写了几年之后&#xff0c;我渐渐意识到一个规律&#xff1a;判断一个人是不是真的吃透了Python&#xff0c;不是看他背了多少API&#xff0c;也不是看他能写多复杂的列表推导式&#xff0c;而是看他…

作者头像 李华