利用HtmlParse獲取Html內容並提取
阿新 • • 發佈:2019-01-26
一. 網上獲取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);
}