美文网首页
正则表达式从url中抓取特定变量

正则表达式从url中抓取特定变量

作者: 憨人Zoe | 来源:发表于2018-05-16 14:31 被阅读0次

最近的一个需求,需要把网站的一些老的url做301跳转至新url,新老地址的path格式不一致,比如:

老url:
http://www.old.com/path/abc/shanghai-123/?p=xxx

新url:
http://www.new.com/path/shanghai-abc-123/?p=xxx

换一种方式表示可以看成是:

老url(其中包含两个变量):
http://www.old.com/path/abc/{cityname}-{cityid}/?p=xxx

新url(同上,但位置可能不同):
http://www.new.com/path/{cityname}-abc-{cityid}/?p=xxx

利用正则表达式抓取特定变量:

1、首先在配置中心做如下配置:
{
"match": "http://www.old.com/path/abc/",
"template": "http://www.new.com/path/{0}-abc-{1}/",
"regex": "path/abc/(?<cityname>\\w+)-(?<cityid>\\d+)",
"params": ["cityname","cityid"]
}

其中比较关键的是regex:"path/abc/(?<cityname>\w+)-(?<cityid>\d+)",已知老url满足path以path/abc/开头,后面是{cityname}-{cityid}。其中cityname是任意字母和数字组合但不包含空白符,用\w表示,cityid是数值用\d表示。

2、编码:
private static void group() {
    String url = "http://www.old.com/path/abc/shanghai-123/";
    String reg = "path/abc/(?<cityname>\\w+)-(?<cityid>\\d+)";
    Pattern pat = Pattern.compile(reg);
    Matcher mat = pat.matcher(url);
    if (mat.find()) {
        System.out.println(mat.group("cityname"));
        System.out.println(mat.group("cityid"));
    }
}

输出:
shanghai 
123
3、替换新模板:
private static void group() {
    String template = "http://www.new.com/path/{0}-abc-{1}/";
    String[] params = {"cityname", "cityid"};
    String url = "http://www.old.com/path/abc/shanghai-123/";
    String reg = "path/abc/(?<cityname>\\w+)-(?<cityid>\\d+)";
    Pattern pat = Pattern.compile(reg);
    Matcher mat = pat.matcher(url);
    if (mat.find()) {
        String[] values = new String[params.length];
        for (int i = 0; i < params.length; i++) {
        values[i] = mat.group(params[i]);
    }
    String result = MessageFormat.format(template, values);
    System.out.println(result);
    }
}

输出:
http://www.new.com/path/shanghai-abc-123/

扩展

1、如果{cityname}本身也包含“-”,可以将regex 改成如下:

String reg = "path/abc/(?<cityname>[\\w,-]+)-(?<cityid>\\d+)";

2、如果path有多个满足用“-”拼接的参数,比如url:http://www.old.com/path/abc/shanghai-123/type-1/?p=xxx,这种情况可以将regex 补全,即:

String reg = "path/abc/(?<cityname>[\\w,-]+)-(?<cityid>\\d+)/type-1";

3、上述情况,如果“type-1”中的1也是变量,同样可以抓取,如:

String reg = "path/abc/(?<cityname>[\\w,-]+)-(?<cityid>\\d+)/type-(?<type>\\d+)";

相关文章

  • 正则表达式从url中抓取特定变量

    最近的一个需求,需要把网站的一些老的url做301跳转至新url,新老地址的path格式不一致,比如: 换一种方式...

  • python爬虫的基本工作流程

    1)首先选取一部分进行挑选的种子URL。 2)将这些URL放入待抓取URL队列 3)从待抓取URL队列中读取待抓取...

  • 网页抓取策略和方法

    网页抓取策略 在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序排列也是一个...

  • 爬虫入门学习手记

    一、简单爬虫架构 URL管理器:管理待抓取URL集合和已抓取URL集合 添加新URL到待爬取集合中 判断待添加UR...

  • 爬虫课堂(十四)|URL的去重方法

    所谓的URL去重,就是爬虫将重复抓取的URL去除,避免多次抓取同一网页。爬虫一般会将待抓取的URL放在一个队列中,...

  • Python爬虫urllib2库的基本使用系列(三)

    1. 网页抓取 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中抓取出来。在Python中有很多库可以用来...

  • 04_爬取策略&bs4

    一. 爬取策略 ​ 在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序...

  • 全程干货 | 解密爬虫抓取、更新网页的策略方法

    抓取策略 在爬虫系统中,待抓取URL是很关键的部分,需要爬虫抓取的网页URL在其中排列,形成一个队列结构,调度程序...

  • 爬虫实战

    爬虫介绍 调度器 URL管理器(用来存储待抓取的链接,已经抓取过的链接) 网页下载器(消费URL管理器中待抓取的链...

  • Python3.5爬虫urllib系列之三

    1,简述 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中抓取出来。在Python中有很多库可以用来抓取网...

网友评论

      本文标题:正则表达式从url中抓取特定变量

      本文链接:https://www.haomeiwen.com/subject/niepdftx.html