• [原]java正则表达式匹配网页页面数据


     转载请说明出处:http://www.cnblogs.com/tanlon/archive/2011/08/23/2151388.html

     最近做项目一直在和正则表达式打交道,也有一些心得,特此记录下来。用正则表达式抓取网页上需要的东西,这里用的QQ音乐里面的一些数据为例。

     基本的正则表达式可以参考:http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html

    public class Radio {

    public static void main(String[] args) {
    String url
    ="http://music.qq.com/miniportal/static/qqdt/dt_program.html";
    AnalysisStream stream
    =new AnalysisStream();
    String content
    =stream.download(url);//获取网页源码

    Radio radio
    =new Radio();
    String str
    =radio.g_programList(content);//用正则表达式匹配出需要的数据
    str=str.replaceAll(":", ":");//将字符串中的:替换成 :
    str=str.replaceAll(".", ".");//将字符串中的.替换成.
    str=str.replaceAll(" ", "");//将字符串中 替换成空格
    str=str.substring(str.indexOf("["),str.indexOf(";"));//截取字符传中的[]里面的内容
    //这里得到的结果如下:
     [{id:0,name:"动感101",desc:"上海FM101.7",pic:"http://imgcache.qq.com/minimusic_v5/img/dt_dg_logo.jpg",url:"mms://diantai.smgbb.cn/dg101",program:"音乐爱联播",time:"06:00—07:00",week:"周六至周日"},
    {id:0,name:"厦门音乐广播",desc:"厦门FM90.9",pic:"http://imgcache.qq.com/minimusic_v5/img/dt_xiameng_logo.jpg",url:"mms://mediasrv2.iptv.xmg.com.cn/yinyue",program:"古典也疯狂",time:"08:00—09:00",week:"周六至周日"},
    {id:0,name:"深圳飞扬971",desc:"珠三角 FM97.1",pic:"http://imgcache.qq.com/minimusic_v5/img/dt_97_logo.jpg",url:"rtspt://vod.szr.com.cn/szr_2",program:"好歌送给你",time:"08:00—10:00",week:"周六至周日"},
    {id:0,name:"深圳飞扬971",desc:"珠三角 FM97.1",pic:"http://imgcache.qq.com/minimusic_v5/img/dt_97_logo.jpg",url:"rtspt://vod.szr.com.cn/szr_2",program:"生日最快乐",time:"07:00—08:00",week:"周一至周五"},....]
      System.out.println(str);

    String[] info
    =radio.splitString(str);//将字符串转换成字符串数组,这里用json转换成JsonArray比较容易,但是找了半天没找到jar包就自己用了一个用切割字符串的方法来处理了
    for(int i=0;i<info.length;i++){
    if(info[i].length()>1){
    String secondinfo
    =info[i].replaceAll("\"", "");//去掉字符串中的双引号
    String[] secondinfos=splitCate(secondinfo,",");//再次切割字符串得到数组
    for(int j=0;j<secondinfos.length;j++){
    System.out.println(secondinfos[j]);
    }
    }
    }

    }
    /**
    * 正则表达式匹配出需要的数据
    *
    @param content 页面源码
    *
    @return 得到需要的数据字符串
    */
    private String g_programList(String content){
    String info
    =null;
    Pattern pattern
    =Pattern.compile("var g_programList = [\\s\\S]+?];");
    Matcher matcher
    =pattern.matcher(content);
    if(matcher.find()){
    String content_li
    =matcher.group();
    info
    =content_li;
    }
    return info;
    }
    /**
    * 将字符串转换成字符数组
    *
    @param content
    *
    @return
    */
    public String[] splitString(String content){
    StringTokenizer commaToker
    = new StringTokenizer(content, "[{*}]");
    String[] result
    = new String[commaToker.countTokens()];
    int k = 0;
    while (commaToker.hasMoreTokens()) {
    result[k]
    = commaToker.nextToken();
    k
    ++;
    }
    return result;
    }
    /**
    * 指定的方式切割指定的字符串
    *
    @param content 要切割的字符串
    *
    @param split 切割方式
    *
    @return 字符串数组
    */
    public static String[] splitCate(String content,String split){
    StringTokenizer commaToker
    = new StringTokenizer(content, split);
    String[] result
    = new String[commaToker.countTokens()];
    int k = 0;
    while (commaToker.hasMoreTokens()) {
    result[k]
    = commaToker.nextToken();
    k
    ++;
    }
    return result;
    }
    }

     最终的到的数据如下:

     id:0

    name:动感101

    desc:上海FM101.7

    pic:http://imgcache.qq.com/minimusic_v5/img/dt_dg_logo.jpg

    url:mms://diantai.smgbb.cn/dg101

    program:音乐爱联播

    time:06:00—07:00

    week:周六至周日

    id:0

    name:厦门音乐广播

    desc:厦门FM90.9

    pic:http://imgcache.qq.com/minimusic_v5/img/dt_xiameng_logo.jpg

    url:mms://mediasrv2.iptv.xmg.com.cn/yinyue

    program:古典也疯狂

    time:08:00—09:00

    week:周六至周日

    id:0

    name:深圳飞扬971

    desc:珠三角 FM97.1

    pic:http://imgcache.qq.com/minimusic_v5/img/dt_97_logo.jpg

    url:rtspt://vod.szr.com.cn/szr_2

    program:好歌送给你

    time:08:00—10:00

    week:周六至周日

    ……

  • 相关阅读:
    BZOJ 5358 口算训练/HDU 6287(可持久化线段树)
    HDU 4288 Coder
    FZU 2289 项链
    jQuery
    HTML5存储技术Storage
    JS第三部分--BOM浏览器对象模型
    JS第二部分--DOM文档对象模型
    JS第一部分--ECMAScript5.0标准语法 (JS基础语法)
    python离线安装包
    DB2不记日志插入,python迭代器操作xlrd,python操作xlwt
  • 原文地址:https://www.cnblogs.com/tanlon/p/2151388.html
Copyright © 2020-2023  润新知