java正则表达式抽取html数据

来源:互联网 发布:nesstool是什么软件 编辑:程序博客网 时间:2024/06/05 04:13

由于项目需求,需要抓取一些网站数据,于是这两天研究了下java正则表达式和java模拟http请求。
一直以来,看到正则表达式就头疼,认为很难看懂,需要就从网上搜,但是这次需要抽取的是html数据,样式多样,靠不住百度,只能靠自己了。

介绍下正则表达式学习历程:
首先是在百度上搜了些简单的入门文章,比如[a-zA-Z]、.*等的意思,然后主要是通过java API文档介绍进行学习,其实里面都比较详细,主要是两个类Pattern和Matcher,
在包java.util.regex下,使用其实很简单,主要步骤:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();

在学习过程中主要对组有点难懂,查了好久,终于有个文章让我恍然大悟,
我的理解是,组的主要作用是方便提取数据,例如一个正则表达式"<a>(.*?)</a>",
里面包含两个组,第一个就是整个表达式,第二个则是<a></a>里的内容,就是(.*?)的内容,这样如果m.group(0)提取的内容就是符合整个表达式的内容,包括<a></a>,
m.group(1)则是里面的内容。java正则表达式中(a)表示组

下面是我写的一个抓取百度上查看某只股票信息的程序。
Java代码  收藏代码
  1. import java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3. import java.net.URL;  
  4. import java.net.URLConnection;  
  5. import java.util.regex.Matcher;  
  6. import java.util.regex.Pattern;  
  7.   
  8. public class PersonalData  
  9. {  
  10. public static void main(String[] args) throws Exception{  
  11.       URL url= new URL("http://www.baidu.com/s?wd=000897");  
  12.       URLConnection urlConnection=   url.openConnection();  
  13.       BufferedReader br=new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));  
  14.       String str="";  
  15.       StringBuffer content=new StringBuffer();  
  16.       while((str=br.readLine())!=null){  
  17.        content.append(str);  
  18.       }  
  19.       br.close();  
  20.     String regx1="<b style=\"font-size: 1.4em; text-align:center;color:#.*;\">(.*?)</b>(.*?)<b style=\"font-size: 1.1em; color:#.*;\">(.*?)</b>(.*?)开盘:</td> <td style=\"(.*?)\">(.*?)</td>(.*?)<td style=\"  color:#.*;width:91px;\">(.*?)</td>(.*?)<td style=\"  color:(.*?);width:91px;\">(.*?)</td>";  
  21.       Pattern p= Pattern.compile(regx1);  
  22.       String text=content.toString();  
  23.       Matcher  macher =p.matcher(text);  
  24.      while(macher.find()){  
  25.       System.out.println("现价:"+macher.group(1).trim());  
  26.       System.out.println("幅度:"+macher.group(3).trim());  
  27.       System.out.println("开盘价:"+macher.group(6).trim());  
  28.       System.out.println("最高:"+macher.group(8).trim());  
  29.       System.out.println("最低:"+macher.group(11).trim());  
  30.      }  
  31. }  
  32. }  

代码简单,没进行封装。(注:百度上搜索看到的股票信息不是即时的,有一定时间的延迟)
0 0
原创粉丝点击