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

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

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


在我们创建配置文件的时候,可能会出现一些值需要重复填写多次的问题。例如我最近写了一个可配置爬虫,只需要配置几条 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月前
|
SQL Java 数据库连接
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
93 0
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
|
6月前
每日一道面试题之怎么确保一个集合不能被修改?
每日一道面试题之怎么确保一个集合不能被修改?
|
7月前
ookie 值的修改方案
ookie 值的修改方案
51 0
|
8月前
|
消息中间件 数据采集 Kafka
每次join之后没有正确处理数据的重复或缺失情况
每次join之后没有正确处理数据的重复或缺失情况
85 1
|
8月前
判断两棵树是否完全一致
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
87 0
|
10月前
怎么确保一个集合不能被修改
怎么确保一个集合不能被修改
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
125 0
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
|
安全 JavaScript Java
行数据上加一个version版本字段,可以有效防止数据重复更新
行数据上加一个version版本字段,可以有效防止数据重复更新
213 0
行数据上加一个version版本字段,可以有效防止数据重复更新
|
SQL BI 关系型数据库
参数为空取全部数据的几种做法
当通过多个参数对数据进行过滤并且不选择某个参数时,希望依然能够查询出其他带条件的数据,也就是参数为空时忽略掉该条件,点击 <a href="http://c.raqsoft.com.cn/article/1543386793666?r=IBelieve" target="_blank" rel="n...
979 0
|
缓存
缓存键重复、冲突带来的数据读取错误
    第二次了,栽在这个问题上, 依然是出自缓存。     需要注意两个问题:     1.根据分类读的数据列表,缓存键需要带上分类ID/分类名称。     2.由于子模块比较多,缓存键命名的时候,整体搜一下是否已存在当前缓存键,否则容易出现多个模块公用一个缓存的现象,导致必有一处数据不对。
913 0