由于项目需求,需要抓取一些网站数据,于是这两天研究了下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)则是里面的内容。[color=red]java正则表达式中(a)表示组[/color]
下面是我写的一个抓取百度上查看某只股票信息的程序。
代码简单,没进行封装。(注:百度上搜索看到的股票信息不是即时的,有一定时间的延迟)
一直以来,看到正则表达式就头疼,认为很难看懂,需要就从网上搜,但是这次需要抽取的是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)则是里面的内容。[color=red]java正则表达式中(a)表示组[/color]
下面是我写的一个抓取百度上查看某只股票信息的程序。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PersonalData
{
public static void main(String[] args) throws Exception{
URL url= new URL("http://www.baidu.com/s?wd=000897");
URLConnection urlConnection= url.openConnection();
BufferedReader br=new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String str="";
StringBuffer content=new StringBuffer();
while((str=br.readLine())!=null){
content.append(str);
}
br.close();
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>";
Pattern p= Pattern.compile(regx1);
String text=content.toString();
Matcher macher =p.matcher(text);
while(macher.find()){
System.out.println("现价:"+macher.group(1).trim());
System.out.println("幅度:"+macher.group(3).trim());
System.out.println("开盘价:"+macher.group(6).trim());
System.out.println("最高:"+macher.group(8).trim());
System.out.println("最低:"+macher.group(11).trim());
}
}
}
代码简单,没进行封装。(注:百度上搜索看到的股票信息不是即时的,有一定时间的延迟)