一日一技:如何处理配置文件中的重复值?

简介: 一日一技:如何处理配置文件中的重复值?

摄影:产品经理一家很多韩国人的螃蟹店里面的某种鸡汤


在我们创建配置文件的时候,可能会出现一些值需要重复填写多次的问题。例如我最近写了一个可配置爬虫,只需要配置几条 XPath,就能够自动生成一个 Scrapy 爬虫。从而快速完成简单网站的爬取。

这个配置文件长这样:

name: 某某网站爬虫
host: 'https://www.kingname.info'
headers: 
 user-agent: xxx
  host: yyyy
  referer: zzz
rule:
  start_url: 'https://www.kingname.info'
  detail_url: //div[@class="xxx"]/a/@href
  next_page_xpath: //div[@class="next"]/@href
  ...其他配置参数...

这个配置文件是使用 YAML 格式创建的。我们可以看到,最外层的host的值为https://www.kingname.info,而在rule里面,start_url的值也是这个网址。这样就重复了。这种重复的情况还有很多,例如列表页的翻页链接的 XPath 与正文页的翻页链接的 XPath 是一样的,多个类型可以具有相同的执行规则等等。

如果你使用 JSON 来作为配置文件的格式,那么确实你要重复写。但如果你使用 YAML 来作为配置文件的格式,那么你可以通过添加锚记(anchor)和别名(alias)的方式,实现一次填写,多次使用的效果。

我们先来看一个简单的例子:

import yaml
config = '''
name: &name 青南
salary: 99999
other_name: *name
'''
info = yaml.safe_load(config)
print(info)

运行效果如下图所示:

可以看到,原本定义一个key-value类型的值,应该是key: value的形式,但是这里我写成key: &锚记名 value,于是,这个锚记名就相当于是一个变量名,就可以在其他地方引用。引用的时候,写作*锚记名。这有点像 C 语言中的获取变量的内存地址(&),然后显示指针的值(*)。锚记名可以 key 相同,也可以不同。

当然,除了简单的key-value,也可以在复杂的场景下使用,例如:

import yaml
config = '''
article_xpath: &article
    title: //div[@class="title"]/text()
    detail: //div[@class="content"]/text()
    image: 
        - //div/img[@class="xx"]/@href
        - //p/img[@class="yy"]/@href
about_xpath:
    summary: //div[@class="summary"]/text()
book_xpath: *article
'''
info = yaml.safe_load(config)

运行效果如下图所示:

这样一来,如果某一项会多次出现的配置发生了修改,我们只需要改一个地方,就能在多个地方同时自动生效,不用再一个一个手动修改了。既节省了时间又不容易出错。

目录
相关文章
|
4月前
|
数据挖掘 Python
如何判断处理后的数据是否仍然存在重复值?
通过以上任意一种方法,都可以有效地判断处理后的数据是否仍然存在重复值,从而确保数据的准确性和唯一性,为后续的数据分析和处理提供可靠的数据基础。
201 66
|
9月前
|
机器学习/深度学习 Python
获取重复的文件
使用 Python 3.10+ 的程序找出图片样本中的重复文件,依赖包 `NStudyPy`。通过计算文件的 MD5 值来识别重复项。核心函数 `get_repeat_file` 接受路径和递归选项,返回一个字典,键为 MD5,值为相同 MD5 的文件列表。`get_file_list` 和 `get_md5` 函数留待后续解释。安装 `NStudyPy`:`pip install -U NStudyPy`。
67 2
|
10月前
|
关系型数据库 MySQL 测试技术
当update修改数据与原数据相同时会再次执行吗
当update修改数据与原数据相同时会再次执行吗
62 1
|
10月前
怎么确保一个集合不能被修改?
怎么确保一个集合不能被修改?
|
10月前
|
存储 弹性计算 运维
错误次数保存到变量2
【4月更文挑战第30天】
28 0
|
10月前
|
存储 弹性计算 运维
错误次数保存到变量
【4月更文挑战第30天】
44 0
|
10月前
|
SQL 数据库连接 数据库
ODBC配置数据源及相关问题(“找不到工程和库”“实时错误91对象变量或with块变量未设置”等)
ODBC配置数据源及相关问题(“找不到工程和库”“实时错误91对象变量或with块变量未设置”等)
ookie 值的修改方案
ookie 值的修改方案
106 0
怎么确保一个集合不能被修改
怎么确保一个集合不能被修改
|
算法 Go
算法练习第十题——寻找重复数(不修改数组)
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。