用正则表达式抓取制定网页的特定内容(本文以抓取a标签为例)

/**
 * 20142014年8月11日下午8:30:32
 *Urls.java
 *home
 */
package net.chnbs.portal.common;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * 项目名称:TaxPortal 类名称:Urls 类描述: 创建人:wangf 创建时间:2014年8月11日 下午8:30:32
 * 修改时间:2014年8月11日 下午8:30:32 修改备注:
 * 
 * @version
 * 
 */
public class Urls {
	private String startUrl; // 开始采集网址

	String urlContent;

	String ContentArea;

	private String strAreaBegin, strAreaEnd; // 采集区域开始采集字符串和结束采集字符串

	@SuppressWarnings("unused")
	private String stringInUrl, stringNotInUrl;

	String strContent;// 获得的采集内容

	String[] allUrls; // 采集到的所有网址

	private String regex; // 采集规则

	UrlAndTitle urlAndTitle = new UrlAndTitle(); // 存储网址和标题

	public static void main(String[] args) throws IOException {
		Urls myurl = new Urls("<body", "/body>");
		myurl.getStartUrl("http://nj.jsgs.gov.cn/col/col350/index.html");
		myurl.getUrlContent();
		myurl.getContentArea();
		myurl.getStringInUrl("http://nj.jsgs.gov.cn/col/col350/index.html");
		myurl.getStringNotInUrl("google");
		myurl.Urls();
	}

	/*
	 * public static void main(String[] args) { try { Document doc =
	 * Jsoup.connect("http://nj.jsgs.gov.cn/col/col350/index.html").post();
	 * Elements e = doc.getElementsByClass("bt_link");
	 * System.out.println(e.text()); } catch (IOException e) {
	 * e.printStackTrace(); } }
	 */
	// 初始化构造函数 strAreaBegin 和strAreaEnd

	public Urls(String strAreaBegin, String strAreaEnd) {
		this.strAreaBegin = strAreaBegin;
		this.strAreaEnd = strAreaEnd;
	}

	//
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List Urls() {
		int i = 0;
		final String regex = "<a[^>]*href=(\"([^\"]*)\"|\'([^\']*)\'|([^\\s>]*))[^>]*" + "class=(\"([^\"]*)\"|\'([^\']*)\'|([^\\s>]*))[^>]*target=(\"([^\"]*)\"|\'([^\']*)\'|([^\\s>]*))[^>]*"
				+ "title=(\"([^\"]*)\"|\'([^\']*)\'|([^\\s>]*))[^>]*>(.*?)</a>";
		final Pattern pt = Pattern.compile(regex);
		final Matcher mt = pt.matcher(ContentArea);
		Map map=null;
		List list=new ArrayList();
		while (mt.find()) {
			if(mt.group(3)==null||mt.group(3)==""){
				break;
			}
			i++;
			// 获取标题
			
			final Matcher title = Pattern.compile("title='([\\s\\S]*?)'").matcher(mt.group());
			while (title.find()) {
				map=new HashMap();
				map.put("title",title.group().replaceAll("title='|'", ""));
				map.put("url", "http://nj.jsgs.gov.cn"+mt.group(3));
				list.add(map);
			}
		}
		/*System.out.println("-----------------"+i+"=============="+list.toString());*/
		return list;

	}

	// 获得开始采集网址
	public void getStartUrl(String startUrl) {
		this.startUrl = startUrl;
	}

	// 获得网址所在内容;
	public void getUrlContent() {

		StringBuffer is = new StringBuffer();
		try {
			URL myUrl = new URL(startUrl);
			BufferedReader br = new BufferedReader(new InputStreamReader(myUrl.openStream(),"UTF-8"));
			String s;
			while ((s = br.readLine()) != null) {
				is.append(s);
			}
			urlContent = is.toString();
		} catch (Exception e)

		{
			System.out.println("网址文件未能输出");
			e.printStackTrace();
		}

	}

	// 获得网址所在的匹配区域部分
	public void getContentArea() {
		int pos1 = 0, pos2 = 0;
		pos1 = urlContent.indexOf(strAreaBegin) + strAreaBegin.length();
		pos2 = urlContent.indexOf(strAreaEnd, pos1);
		ContentArea = urlContent.substring(pos1, pos2);
	}

	// 以下两个函数获得网址应该要包含的关键字及不能包含的关键字
	// 这里只做初步的实验。后期,保护的关键字及不能包含的关键字应该是不只一个的。
	public void getStringInUrl(String stringInUrl) {
		this.stringInUrl = stringInUrl;

	}

	public void getStringNotInUrl(String stringNotInUrl) {
		this.stringNotInUrl = stringNotInUrl;
	}

	// 获取采集规则

	// 获取url网址
	public void getUrl() {

	}

	public String getRegex() {
		return regex;

	}

	class UrlAndTitle {
		String myURL;

		String title;
	}
}

这段代码可以得到我想要的 title和href这两个属性 ,要想获取其他属性可改变正则表达式来实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值