java分析html算法(java網(wǎng)頁(yè)蜘蛛算法示例)
遇到復(fù)雜而繁瑣的html頁(yè)面大家都望而卻步。因?yàn)楹茈y獲取到相應(yīng)的數(shù)據(jù)。
最古老的辦法的是嘗試用正則表達(dá)式,估計(jì)那么繁瑣的東西得不償失,浪費(fèi)我們寶貴的時(shí)間。
第二個(gè)辦法用開(kāi)源組織htmlparser的包,這個(gè)是一個(gè)比較老的項(xiàng)目,但是效果估計(jì)不是很好,好像不可以深入分析html,只能分析5級(jí)的結(jié)構(gòu);
我這里有個(gè)htmlparser的源代碼,可以獲取所有的超鏈接的
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package test;
import java.util.HashMap;
import java.util.Map;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
public class GetLinkTest {
public static void main(String[] args) {
try {
// 通過(guò)過(guò)濾器過(guò)濾出<A>標(biāo)簽
Parser parser = new Parser("http://www.fzitv.net");
NodeList nodeList = parser.extractAllNodesThatMatch(new NodeFilter() {
// 實(shí)現(xiàn)該方法,用以過(guò)濾標(biāo)簽
public boolean accept(Node node) {
if (node instanceof LinkTag)// 標(biāo)記
{
return true;
}
return false;
}
});
// 打印
for (int i = 0; i < nodeList.size(); i++) {
LinkTag n = (LinkTag) nodeList.elementAt(i);
//System.out.print(n.getStringText() + " ==>> ");
//System.out.println(n.extractLink());
try {
if (n.extractLink().equals("http://www.fzitv.net")) {
System.out.println(n.extractLink());
}
} catch (Exception e) {
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
第三個(gè)辦法,也是我現(xiàn)在一直在用的辦法,首先把html清理為xml,然后用java解析xml獲取數(shù)據(jù),現(xiàn)在上傳一個(gè)java clean html的源代碼:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package exec;
import java.io.File;
import java.io.IOException;
import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.PrettyXmlSerializer;
import org.htmlcleaner.TagNode;
/**
*
*/
public class HtmlClean {
public void cleanHtml(String htmlurl, String xmlurl) {
try {
long start = System.currentTimeMillis();
HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();
props.setUseCdataForScriptAndStyle(true);
props.setRecognizeUnicodeChars(true);
props.setUseEmptyElementTags(true);
props.setAdvancedXmlEscape(true);
props.setTranslateSpecialEntities(true);
props.setBooleanAttributeValues("empty");
TagNode node = cleaner.clean(new File(htmlurl));
System.out.println("vreme:" + (System.currentTimeMillis() - start));
new PrettyXmlSerializer(props).writeXmlToFile(node, xmlurl);
System.out.println("vreme:" + (System.currentTimeMillis() - start));
} catch (IOException e) {
e.printStackTrace();
}
}
}
- java在網(wǎng)頁(yè)上面抓取郵件地址的方法
- java抓取網(wǎng)頁(yè)數(shù)據(jù)示例
- java 抓取網(wǎng)頁(yè)內(nèi)容實(shí)現(xiàn)代碼
- java抓取網(wǎng)頁(yè)數(shù)據(jù)獲取網(wǎng)頁(yè)中所有的鏈接實(shí)例分享
- java實(shí)現(xiàn)網(wǎng)頁(yè)解析示例
- java使用htmlparser提取網(wǎng)頁(yè)純文本例子
- 使用java將動(dòng)態(tài)網(wǎng)頁(yè)生成靜態(tài)網(wǎng)頁(yè)示例
- java簡(jiǎn)單網(wǎng)頁(yè)抓取的實(shí)現(xiàn)方法
相關(guān)文章
Java中的深拷貝(深復(fù)制)和淺拷貝(淺復(fù)制)介紹
這篇文章主要介紹了Java中的深拷貝(深復(fù)制)和淺拷貝(淺復(fù)制)介紹,需要的朋友可以參考下2015-03-03
Java之MyBatis的Dao方式以及Dao動(dòng)態(tài)代理詳解
這篇文章主要介紹了Java之MyBatis的Dao方式以及Dao動(dòng)態(tài)代理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Spring?Boot將@RestController誤用于視圖跳轉(zhuǎn)問(wèn)題解決
這篇文章主要為大家介紹了Spring?Boot將@RestController誤用于視圖跳轉(zhuǎn)問(wèn)題解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Java設(shè)置Access-Control-Allow-Origin允許多域名訪問(wèn)的實(shí)現(xiàn)方法
這篇文章主要介紹了Java設(shè)置Access-Control-Allow-Origin允許多域名訪問(wèn)的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
java 靜態(tài)代理 動(dòng)態(tài)代理深入學(xué)習(xí)
代理模式是常用的java設(shè)計(jì)模式,特征是代理類與委托類有同樣的接口,代理類主要負(fù)責(zé)為委托類預(yù)處理消息、過(guò)濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后處理消息等,需要的朋友可以參考下2012-11-11
Spring整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法
下面小編就為大家?guī)?lái)一篇Spring整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
Java classloader和namespace詳細(xì)介紹
這篇文章主要介紹了Java classloader和namespace詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-03-03

