我们在做爬虫的时候,要提取网页的信息,一个网页中的信息可能有很多,我们要去筛选,例如我们要获取一个网页中的所有子链接,这个就需要我们用正则表达式去匹配,匹配后得到的数据我们要的东西了,下面简单介绍一下,学过的可以当复习,没学过的就好好看看。
正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,简单说,就是我们写个模板,然后去匹配字符串。
下面我们来看看一些基本的正则表达式的语法:
:将下个字符标记为一个特殊的字符、一个原义字符、一个向后引用或者一个八进制转义符例如“ ”就是匹配一个换行符。
^:匹配开始位置,^(a)这个就匹配开头必须为a。
$:匹配结束位置,$(a)这个就匹配结尾必须为a。
*:匹配前面的子表达式零次或者多次,如“xu*”这个表达式就能够匹配“x”和“xuu”。
+:匹配前面的子表达式一次或者多次,如“xu+”这个表达式就能够匹配“xuu”和“xu”,但不能够匹配“x”,这个就是和“*”的区别。
?:匹配前面的子表达式零次或者一次,如“xu?”这个表达式就能够匹配“jian(guo)?”就可以匹配“jian”和“jianguo”。
{n}:n是一个非负数,匹配n次,如“guo{2}”,可以匹配“guoo”,不能匹配“guo”。
{n,}:n是一个非负数,匹配至少n次。
{n, m}:m、n都是非负数,最少匹配n次,最多匹配m次。
(pattern):匹配pattern并获取匹配结果。
(?:pattern):匹配pattern但不获取匹配结果。
x|y:匹配x或y,如“(xu|jian)guo”匹配“xuguo”或者“jianguo”。
[xyz]:字符集合,匹配所包含的任意字符。如“[abc]”可以匹配“apple”中的“a”。
[^xyz]:匹配未被包含的字符。
[a-z]:字符范围,匹配指定范围内的任意字符。
[^a-z]:匹配指定不在范围内的任意字符。
:匹配一个单词的边界,如“guo”可以匹配“xujianguo”中的“guo”。
B:匹配非单词边界,如“jianB”可以匹配“xujianguo”中的“jian”。
d:匹配一个数字字符,等价于“[0-9]”。
D:匹配一个非数字字符。
f:匹配一个换页符。
:匹配一个换行符。
:匹配一个回车符。
s:匹配任何空白字符
其实还有很多语法我就不一一列举了,先说这么多先,下面看看具体的用法。
在java.util.regex包下有两个类:Pattern和Matcher,Pattern类是正则表达式的编译形式,其实就是代表了一个正则表达式,Matcher类就是执行正则表达式匹配操作的引擎。
Pattern类:
compile静态方法:接受String参数,就是正则表达式了,将这个表达式编译到模式中。
matcher方法:接受String参数,创建匹配给定输入的匹配器,也即使返回一个Matcher对象。
spilt方法:以正则表达式分割字符串。
Matcher类:
matches方法:用来判断整个输入字符串是否匹配正则表达式模式。
lookingAt方法:用来判断该字符串的开始部分是否能够匹配模式。
find方法:尝试查找与该模式匹配的下一个子序列。
group方法:捕获之前匹配的子序列值。
下面用几个例子练练手:
1.判断输入的字符串是否已Java开头,任意字符串结尾
@Test public void testBegin() { Pattern pattern = Pattern.compile("^Java.*"); Matcher matcher = pattern.matcher("Java is good"); //结果打印:true System.out.println(matcher.matches()); }
2.以空格和逗号分割字符串
@Test public void testSpilt() { Pattern pattern = Pattern.compile("[, ]+"); String[] strs = pattern.split("hello world,enen yesyes,, okok"); for(String str : strs) System.out.println(str); }
3.利用HttpClient,捕获网页中的“<a>”标签,因为这个标签中有我们要的链接,就是href属性的值。
@Test public void testGetURL() throws Exception { HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://www.baidu.com"); HttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); String urlPattern = "<[aA]\s+(href=[^>]+\s*)>.*?</[aA]>"; Pattern pattern = Pattern.compile(urlPattern); if (entity != null) { InputStream instream = entity.getContent(); int l; byte[] temp = new byte[1024]; while ((l = instream.read(temp)) != -1) { Matcher matcher = pattern.matcher(new String(temp, 0, l, "utf-8")); while(matcher.find()) System.out.println(matcher.group()); } } }