您的位置:首页 > 编程语言 > Java开发

java正则表达式匹配网页页面数据

2014-10-24 13:18 477 查看
最近做项目一直在和正则表达式打交道,也有一些心得,特此记录下来。用正则表达式抓取网页上需要的东西,这里用的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:周六至周日

……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: