1. 程式人生 > >利用HtmlParse獲取Html內容並提取

利用HtmlParse獲取Html內容並提取

一.      網上獲取html內容

1.利用url獲取html內容:


public static String getHtmlContent(String urlstr){
		/*思路: 1.讀出原網頁:url--》openstream--》inputStreamRead---》bufferReader---》。read
		 * 2.解決自動識別字符編碼 利用cpdetecter:http://sourceforge.jp/projects/sfnet_cpdetector/

		*/
		String result="";
		if(StringUtil.isEmpty(urlstr)) return null;
		try {
			String charset = getCode(urlstr);
			//System.out.println(charset);
			URL url = new URL(urlstr);
			InputStream is = url.openStream();
			InputStreamReader isr = new InputStreamReader(is, charset);
			BufferedReader br = new BufferedReader(isr);
			String temp =null;
			while(true){
				temp = br.readLine();
				/*if(StringUtil.isNotEmpty(temp)){*/  // 這個工具不能濫用,因為temp可能是“”但是正文沒結束;   
				if(temp !=null){
					result += temp+"\n";
				}else{
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
		return result;
		
	}

2.自動原始碼的識別字符編碼

public static StringgetCode(String url){
        // 引入cpdector包(),利用CodepageDetectorProxy代理裝入JChardetfacade容器,然後detectCodePage出東東;具體檢視文件,並自己推敲出來。
        String result="";
        if(StringUtil.isEmpty(url))return null;
       
        CodepageDetectorProxy cdp =CodepageDetectorProxy.getInstance();
        cdp.add(JChardetFacade.getInstance());
        try {
            result = cdp.detectCodepage(newURL(url)).toString();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return result;


    3.總結如何引入包,如何快速推敲所需的類

         在包中有一個說明文件:binary-release.txt,仔細閱讀即可。

      我們知道CodepageDetectorProxy 是一個代理類,是個單例模式;開發api中有

 說明這個代理類需要一個容器,於是我們找到ICodepageDetector有:

這幾個實現類都是有對用功能的類,故由名字可以猜出JChardetFacade…這個可能比較大

-

二.      正則表示式提取內容

在StringUtil中新增這個方法

public static StringgetContentUseRegex(String regexString ,String content,int index){
        String result="";
        if(isEmpty(regexString)|| isEmpty(content)) return result;
       
        Pattern pattern = Pattern.compile(regexString);
        Matcher matcher =pattern.matcher(content);
        if(matcher.find()){
            //System.out.println("find");
            result = matcher.group(index);
        }
        return result;
}
測試:
@Test
    public voidgetContentUseRegexTest(){
        //<h1 itemprop="headline">習近平在中非合作論壇約翰內斯堡峰會上總結講話</h1>
        String source = "<h1itemprop=\"headline\">習近平在中非合作論壇約翰內斯堡峰會上總結講話</h1>";
        String regex ="<h1(.*)itemprop=\\\"headline(.*)\\\">(.*)</h1>";
        String str = StringUtil.getContentUseRegex(regex,source,3);
        System.out.println(str);
       
        //<divclass="time" id="pubtime_baidu" itemprop="datePublished"content="2015-12-06T08:35:00+08:00">2015-12-06 08:35:00</div>
        source = "<divclass=\"time\" id=\"pubtime_baidu\"itemprop=\"datePublished\"content=\"2015-12-06T08:35:00+08:00\">2015-12-0608:35:00</div>";
        regex = "<div(.*)itemprop=\\\"datePublished\\\"(.*)>(.*)</div>";
        str = StringUtil.getContentUseRegex(regex,source, 3);
        System.out.println(str);
}

三.      htmlparser抽取內容

1引入htmlparser.jar,htmlexer.jar

2封裝獲取節點文字方法

public static StringgetContentUseParse(String urlstr,String encoding,String tag,StringattrName,String attrVal){
        /* 思路:引用htmlParse包--》Parse。parse(AndFileter)
         *其中NodeFileter是一個介面,AndFilterTagNameFilter HasAttributeFilter都是其實現類
         *AndFilter 是一個可以層層封裝的過濾類;用AndFilter andFilter= new AndFilter(new TagNameFilter("h1"),new HasAttributeFilter("itemprop","headline"));
         *解析後得到NodeList ,於是就可以了
         */    
        String result ="";
        AndFilter andFilter=null;
        if(StringUtil.isEmpty(urlstr))return result;
        if(StringUtil.isEmpty(encoding))encoding="utf-8";
        try {
            Parser parser = newParser(urlstr);
            parser.setEncoding(encoding);
            if(StringUtil.isNotEmpty(attrName)&& StringUtil.isNotEmpty(attrVal)){
                 andFilter = newAndFilter(new TagNameFilter(tag),newHasAttributeFilter(attrName, attrVal));
            }else if(StringUtil.isNotEmpty(attrName)&& StringUtil.isEmpty(attrVal)){
                 andFilter = newAndFilter(new TagNameFilter(tag),newHasAttributeFilter(attrName));
            }else{
                NodeFilter[]  nodeFilters = newNodeFilter[1];
                nodeFilters[0] = newTagNameFilter(tag);
                 andFilter = newAndFilter(nodeFilters);
            }
            NodeList nodeLists =parser.parse(andFilter);
            parser.reset();
            Node node = nodeLists.elementAt(0);
            result = node.toPlainTextString();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return result;
   }
       3 測試:
@Test
	public void getHtmlContentUseParseTest(){
		//<div class=\"time\" id=\"pubtime_baidu\" itemprop=\"datePublished\" content=\"2015-12-06T08:35:00+08:00\">2015-12-06 08:35:00</div>
		//<h1 itemprop="headline">習近平在中非合作論壇約翰內斯堡峰會上總結講話</h1>
		String encoding = HtmlUtil.getCode("http://news.sohu.com/20151206/n429917146.shtml");
		String str = HtmlUtil.getContentUseParse("http://news.sohu.com/20151206/n429917146.shtml", encoding,"h1","itemprop","headline");
	
		System.out.println(str);
	}