1.将页面内容中的skuid与skuimgurl筛选出来。
http://qwd.jd.com/fcgi-bin/qwd_searchitem_ex?skuid=26878432382%7C1658610413%7C26222795271%7C25168000024%7C117
31514723%7C26348513019%7C20000220615%7C4813030%7C25965247088%7C5327182%7C19588651151%7C1780924%7C15495544751%7
C10114188069%7C27036535156%7C10123099847%7C26016197600%7C10503200866%7C16675691362%7C15904713681
解析:使用正则匹配时我们可以使用次工具进行试验以查看是否能够正确匹配到:https://regex101.com/
如图所示:1表示你的正则式,2为总内容,3为匹配到的信息
打开练习中的网址可以得到很多商品信息,如UID,URL,介绍信息。我们把信息粘贴到在线正则解析器中如图:
然后就可以在上面的栏中填写正则开始匹配了。
那么先从第一个字段开始匹配:skuid
从内容中可以看到skuid两边有双引号,那么要是用\进行转义:\"skuid\"
如图所示:当我们在正则栏中填写之后,下面的内容会变颜色,并且右边的显示栏会显示匹配到的信息,这样我们就一目了然了。
继续往后走,后面有:及被引起来的ID:\"skuid\":\"\d+\"
\d 表示数字 + 表示匹配前面字符一次或者无限次 这连个连起来就是:匹配数字一次或者无限次,只要是连着的都会被匹配到。如图:
这样skuid就匹配到了,继续往下走,后面跟着,及回车符那么我们可以这样匹配:\"skuid\":\"\d+\",\s+
\s 表示空白字符 回车 tab 空格 都可以匹配到 + 表示匹配一次或者无限次 连起来就是:匹配空白字符一次或者无限次 如图后面的内容就会被匹配到了:
那么开始第二行的匹配:第二行的内容由spuid及skuurl组成,并且中间有空格,那么我们就可以这样匹配:\S+
\S 此处为大写 表示非空白字符 与+连接表示:匹配非空白字符一次或者无限次 如图第二行中空格之前的字符都会被匹配到:
接下来开始匹配skuurl:\"skuid\":\"\d+\",\s+\S+\s+\"skuurl\":\"\S+
方法与前面的一样:
\s 表示空白字符 与+连接使用 \" 因为有引号先用进行转义 skuurl直接写 \" 又一个引号转义 :直接写 \"引号转义
之后就是URL了 使用\S 表示非空白字符 与+连接使用
此时的匹配会在空白符前停下,我们继续往下写:\s+ 匹配一次或者无限次的空白字符
之后匹配skuimgurl就跟前面的一样了:\"skuid\":\"\d+\",\s+\S+\s+\"skuurl\":\"\S+\s+\"skuimgurl\":\"\S+\"
至此,我们需要的都匹配完了,但是还要把需要的字段用()括起来,以方便我们使用。
\"skuid\":\"(\d+)\",\s+\S+\s+\"skuurl\":\"\S+\s+\"skuimgurl\":\"(\S+)\"
此图为右边匹配到的信息:其中有两个group,就为我们用()括起来的信息。(关于group具体信息查看上篇文章)
此时我们的正则式已经写完了,并且可以匹配到信息。开始使用pycharm进行编写。
先将网页上的内容下载下来:
from pip._vendor import requests url = "http://qwd.jd.com/fcgi-bin/qwd_searchitem_ex?skuid=26878432382%7C1658610413%7C26222795271%7C25168000024%7C11731514723%7C26348513019%7C20000220615%7C4813030%7C25965247088%7C5327182%7C19588651151%7C1780924%7C15495544751%7C10114188069%7C27036535156%7C10123099847%7C26016197600%7C10503200866%7C16675691362%7C15904713681" session = requests.session() r = session.get(url) html = r.text print(html)
结果为:
可见我们已将内容正确的下载了。
之后开始对内容进行正则匹配,使用我们之前的正则式。
import re from pip._vendor import requests url = "http://qwd.jd.com/fcgi-bin/qwd_searchitem_ex?skuid=26878432382%7C1658610413%7C26222795271%7C25168000024%7C11731514723%7C26348513019%7C20000220615%7C4813030%7C25965247088%7C5327182%7C19588651151%7C1780924%7C15495544751%7C10114188069%7C27036535156%7C10123099847%7C26016197600%7C10503200866%7C16675691362%7C15904713681" session = requests.session() r = session.get(url) html = r.text reg = re.compile(r"\"skuid\":\"(\d+)\",\s+\S+\s+\"skuurl\":\"\S+\s+\"skuimgurl\":\"(\S+)\"") result = reg.findall(html) print(result)
结果为:
可以看见,我们想要的信息已经匹配出来了。
2.将文件a.conf中的所有upstream及location都分别创建文件并将内容写入其中。
部分内容:
upstream orderCenter.ga10.wms5.jd.local {
server 10.46.0.161:8023 weight=10 max_fails=2 fail_timeout=30s;server 10.46.0.162:8023 weight=10 max_fails=2 fail_timeout=30s;
}
upstream opperftrace.ga10.wms5.jd.local {
server 10.46.0.164:8060 weight=10 max_fails=2 fail_timeout=30s;
}
upstream taskassign-c.ga10.wms5.jd.local {
server 10.46.0.162:8005 weight=10 max_fails=2 fail_timeout=30s;
}
upstream smartQuery.ga10.wms5.jd.local {
server 10.46.0.164:8013 weight=10 max_fails=2 fail_timeout=30s;
}
upstream center.ga10.wms5.jd.local {
server 10.46.0.164:9020 weight=10 max_fails=2 fail_timeout=30s;
server 10.46.0.163:9020 weight=10 max_fails=2 fail_timeout=30s;
}
location /wump-heartbeat/ {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 0;
proxy_pass http://wump-heartbeat.wms5.jd.local/;
}
location /master/ {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 0;
proxy_pass http://master.wms5.jd.local/;
}
location /mcs/ {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 0;
proxy_pass http://mcs.wms5.jd.local/;
}
我们先使用 https://regex101.com/ 进行正则的编写。
先进行upstream的匹配:
(upstream\s+(\S+)\s+{[^}]+}) 可以对所有的upstream进行匹配,别忘了加上括号。
解析:
upstream 直接写 \s+ 匹配空白字符一次或者无限次 \S+ 匹配非空白字符一次或者多次
\s+ 匹配空白字符一次或者无限次
{ 直接写 [^}]+ 其中^ 表示以什么开头 ,如^a 则表示以a开头的,如果^在[] 中则表示不包含的,如[^a] 表示不含a的字符
那么[^}]+ 则表示为匹配 不包含}的字符一次或者多次
} 直接写
如图:我们已将upstream名字 及内容都匹配出来了,可以进行编辑了。
import codecs regUpstream = re.compile(r"(upstream\s+(\S+)\s+{[^}]+})")#定义正则匹配 with codecs.open("a.conf") as f: #打开文件 textlist = regUpstream.findall(f.read()) #对文件内容进行匹配 print(textlist)
结果为:
已经对文件正确的进行了匹配,下面要进行创建文件并写入内容了。
import os
os.mkdir("upstream") #创建upstream目录 os.chdir("upstream") #进入upstream目录 for i in textlist: #遍历上面筛选出的内容 with codecs.open(i[1],"w") as fw: #创建文件,文件名为upstream模块名 fw.write(i[0]) #将匹配到的内容写入到文件中 os.chdir("..") #进入上层目录
运行之后:
可以看见已经达到了想要的结果。
上面创建的时候还可以进行优化,如可以在创建upstream目录时先进行判断目录是否已经存在,不存在则进行创建。
筛选location并创建文件的方法与upstream相同。(location\s+/(\S+)/\s+{[^}]+}) 正则式
regLocation = re.compile(r"(location\s+/(\S+)/\s+{[^}]+})") with codecs.open("a.conf") as f2: textlist2 = regLocation.findall(f2.read()) if not os.path.exists("location"): #判断目录是否存在 os.mkdir("location") os.chdir("location") for i2 in textlist2: file = i2[1] + ".location.conf" #将文件名加上指定字符 with codecs.open(file,"w") as f2w: f2w.write(i2[0]) os.chdir("..")
运行之后可看见目录,文件,内容 ,都已完成: