本篇主要以实际例子来说明一下怎么样用java的模式匹配来提取网页中你所需要的内容,比如说你需要提取一个网页中的<title></title>标签内的文字内容该如何做呢?下面我会做一个介绍。介绍之前我先说明一下此系列文章的目的。我们将会持续写一些关于webspider的技术的文章,结合的例子就是我们前一段时间做的一个入门级的爬虫,我们将来也会把这个爬虫整体的共享出来。
好言归正传,进入今天的主题,今天要讲的内容是建立在上一篇基础上的,也就是你需要对上一篇的正则表达式有个了解,至少要能看懂,当然也要对java熟悉。
首先第一个是上面提到的提取<title>标签的内容。先看代码
public synchronized String parseTitle(String context)
{
String result="";
String patWhTitle="<\\s*?(title)\\s*?>[\\s\\S]*?</\\s*?(title)\\s*?>";
String patTitle="</?\\s*?(title)\\s*?>";
Pattern titlePattern=Pattern.compile(patWhTitle,2);
Matcher titleMatcher=titlePattern.matcher(context);
Pattern titlePattern2=Pattern.compile(patTitle, 2);
while(titleMatcher.find())
{
String title=titleMatcher.group();
Matcher titleMatcher2=titlePattern2.matcher(title);
result+="["+titleMatcher2.replaceAll("")+"]";
}
return result;
}
首先定义两个正则表达式 patWhTitle,这个是要匹配网页中所有<title>标签和标签的内容。patTitle这个正则是只匹配<title>标签。
然后编译匹配等等
本篇所要讲的和上一篇有些不同,多了一步匹配,相信大家都看出来了,这是怎么回事呢?为什么要这么做呢?我结合这个title例子大概讲一下匹配的过程,其他的也都是类似。1、从网页中匹配出所有<title>标签及其内容,e.g<title>myspace</title>。2、从匹配到的string再次匹配出标签。3、然后调用replaceall方法来把标签都替换成“”,只剩下需要的内容。
不知道我是否讲解的清楚了,再贴一个函数来练习下
public synchronized String parseA(String context)
{
String result="";
String patWhA="<[a]\\s+?[^>]*?>[^<]+?</[a]\\s*?>";
String patA="</?\\s*?[a][\\s\\S]*?>";
Pattern aPattern=Pattern.compile(patWhA,2);
Matcher aMat=aPattern.matcher(context);
Pattern aPattern2=Pattern.compile(patA,2);
while(aMat.find())
{
String a=aMat.group();
Matcher mat=aPattern2.matcher(a);
result+="["+mat.replaceAll("")+"]";
}
return result;
}
这个函数是提取超链接的内容