使用方式
语法
name: 函数名
regex: 表达式或者空
value: 空、字符串或者表达式
"value_handler":[
{"name":"函数名","regex":"表达式或者空","value":"空、值或者表达式"}
]
方式1
"company_name" : {
"field" : "company_name",
"depict" : "联系人",
"status" : true,
"type" : "",
"select" : "xpath",
"deep" : false,
"regex" : "//div[@class='cpy-bar']/a[3]/h1/text()",
"value_handle" : [
{
"name":"prefix",
"regex":"",
"value":"http://wwww.baidu.com"
}
],
"split" : false
}
方式2
value_handler里可以放多个,需要注意的点是别忘记逗号,
{
"name":"prefix",
"regex":"",
"value":"http://wwww.baidu.com"
}
"company_name" : {
"field" : "company_name",
"depict" : "联系人",
"status" : true,
"type" : "",
"select" : "xpath",
"deep" : false,
"regex" : "//div[@class='cpy-bar']/a[3]/h1/text()",
"value_handle" : [
{
"name":"prefix",
"regex":"",
"value":"http://wwww.baidu.com"
},
{
"name":"postfix",
"regex":"",
"value":"html"
},
],
"split" : false
}
已有的value_handler 函数
name | regex | value | 函数解释 | 例子 |
---|---|---|---|---|
prefix | 空字符串 | 字符串 | 在提取到的内容之前添加value指定的值 | {“name”:“prefix”,“regex”:"",“value”:“wwww.baidu.com”} |
postfix | 空字符串 | 字符串 | 在提取到的内容之后添加value指定的值 | {“name”:“postfix”, “regex”:"", “value”:“wwww.baidu.com”} |
replace | 正则表达式 | 字符串/正则表达式 | 将提取到的字段中的regex替换成value | {“name”:“replace”, “regex”:"\d+", “value”:“zhongwen”} |
extract | 正则表达式 | 空字符串 | 找到所有regex表示的字符串并返回最后一个,如果没有则返回空 | |
static | 空字符串 | 字符串数字 | 返回value的数值 | {“name”:“static”, “regex”:"", “value”:“123”} |
join | 使用的分隔符 | 空字符串 | 使用regex拼接的字符串 | {“name”:“join”, “regex”:",", “value”:""} |
prefix
"company_name" : {
"field" : "company_name",
"depict" : "联系人",
"status" : true,
"type" : "",
"select" : "xpath",
"deep" : false,
"regex" : "//div[@class='cpy-bar']/a[3]/h1/text()",
"value_handle" : [
{
"name":"prefix",
"regex":"",
"value":"http://wwww.baidu.com"
}
],
"split" : false
}
比如说使用 //div[@class=‘cpy-bar’]/a[3]/h1/text()这个xpath提取到的内容是/abc.html,需要在/abc.html之前加上http://wwww.baidu.com,那value_handler可以写成
"value_handle" : [
{
"name":"prefix",
"regex":"",
"value":"http://wwww.baidu.com"
}
postfix
这个例子类似postfix,作用是在提取到的字段后面拼接上value值。
replace
regex可以使用字符串或者正则表达式
- regex是普通字符串
比如说使用 //div[@class=‘cpy-bar’]/a[3]/h1/text()这个xpath提取到的内容是 联系人张文战 ,我们要把 “联系人” 替换成空白字符串,结果为张文战 , value_handler可以这么写
"value_handle" : [
{
"name":"replace",
"regex":"联系人",
"value":""
}
- regex是正则表达式或者字符串
比如说使用 //div[@class=‘cpy-bar’]/a[3]/h1/text()这个xpath提取到的内容是 123张文战 ,我们要把 “123” 替换成"联系人",结果为联系人张文战 ,value_handler可以这么写
"value_handle" : [
{
"name":"replace",
"regex":"\d+",
"value":"联系人"
}
extract
regex是正则表达式或者字符串
比如说使用 *//div[@class=‘cpy-bar’]/a[3]/h1/text()*这个xpath提取到的内容是 低 ,我们要把 “低”提取出来,value_handler可以这么写
"value_handle" : [
{
"name" : "extract",
"regex" : "(低|中|高|顶)",
"value" : ""
}
]
这个例子可以提取结果字段中的"低"、“中”、“高”、“顶”。
static
返回value指定的字符串,一般用来指定最大页码
"value_handle" : [
{
"name" : "static",
"regex" : "",
"value" : "100"
}
]
返回 “100”
join
比如说使用 *//div[@class=‘cpy-bar’]/a[3]/h1/text()*这个xpath提取到的内容是 110,需要将结果转换为’1-1-0’,则可以写如下的value_handler
"value_handle" : [
{
"name" : "join",
"regex" : "-",
"value" : ""
}
]
urljoin
函数作用是做url拼接,使用了python原生的urljoin函数,
python3 的引入方式为from urllib import parse
python2 的引入方式为from urlparse import urljoin
value: url,http://www.baidu.com或者https://www.baidu.com,一定要有http或者https。如果value为空字符串,则以当前抓取到的页面url作为url
def urljoin(self, *args, **kwargs):
data = kwargs.get("data")
domain = str(kwargs.get("value"))
if domain == '':
domain = self.response.url
if isinstance(data, list):
result = []
for i in data:
result.append(urljoin(domain, str(i)))
else:
result = urljoin(domain, str(kwargs.get("data")))
return result
- value为空的时候
比如说使用 //div[@class=‘cpy-bar’]/a[3]/h1/text()这个xpath提取到的内容为/ershoufang/101106686239.html,而当前页面为https://bj.lianjia.com/ershoufang/pg2/,则使用join这个函数后产生的新连接为https://bj.lianjia.com/ershoufang/ershoufang/101106686239.html,value_handler如下
"value_handle" : [
{
"name":"urljoin",
"regex":"",
"value":""
}
- value不为空的情形
比如说使用 //div[@class=‘cpy-bar’]/a[3]/h1/text()这个xpath提取到的内容为/ershoufang/101106686239.html,将value设置为https://bj.lianjia.com,则使用join这个函数后产生的新连接为https://bj.lianjia.com/ershoufang/ershoufang/101106686239.html,
value_handler如下
"value_handle" : [
{
"name":"urljoin",
"regex":"",
"value":"https://bj.lianjia.com"
}