近來有些朋友在做蜘蛛演算法,或者在網頁上面做深度的資料採礦。但是遇到複雜而繁瑣的html頁面大家都望而卻步。因為很難擷取到相應的資料。
最古老的辦法的是嘗試用Regex,估計那麼繁瑣的東西得不償失,浪費我們寶貴的時間。
第二個辦法用開源組織htmlparser的包,這個是一個比較老的項目,但是效果估計不是很好,好像不可以深入分析html,只能分析5級的結構;
我這裡有個htmlparser的原始碼,可以擷取所有的超連結的
/*<br /> * To change this template, choose Tools | Templates<br /> * and open the template in the editor.<br /> */<br />package test;</p><p>import java.util.HashMap;<br />import java.util.Map;</p><p>import org.htmlparser.Node;<br />import org.htmlparser.NodeFilter;<br />import org.htmlparser.Parser;<br />import org.htmlparser.tags.LinkTag;<br />import org.htmlparser.util.NodeList;</p><p>/**<br /> *<br /> * @author Arjick@163.com<br /> */<br />public class GetLinkTest {</p><p> public static void main(String[] args) {</p><p> try {<br /> // 通過過濾器過濾出<A>標籤<br /> Parser parser = new Parser("http://detail.china.alibaba.com/buyer/offerdetail/65296413.html?tracelog=chinaindex_recom_c2");<br /> NodeList nodeList = parser.extractAllNodesThatMatch(new NodeFilter() {<br /> // 實現該方法,用以過濾標籤<br /> public boolean accept(Node node) {<br /> if (node instanceof LinkTag)// 標記<br /> {<br /> return true;<br /> }<br /> return false;<br /> }<br /> });<br /> // 列印<br /> for (int i = 0; i < nodeList.size(); i++) {<br /> LinkTag n = (LinkTag) nodeList.elementAt(i);<br /> //System.out.print(n.getStringText() + " ==>> ");<br /> //System.out.println(n.extractLink());<br /> try {<br /> if (n.extractLink().equals("http://zjdilong.cn.alibaba.com/athena/bizreflist/zjdilong.html")) {<br /> System.out.println(n.extractLink());<br /> }<br /> } catch (Exception e) {<br /> }<br /> }<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> }</p><p> }<br />}
第三個辦法,也是我現在一直在用的辦法,首先把html清理為xml,然後用java解析xml擷取資料,現在上傳一個java clean html的原始碼:
/*<br /> * To change this template, choose Tools | Templates<br /> * and open the template in the editor.<br /> */<br />package exec;</p><p>import java.io.File;<br />import java.io.IOException;<br />import org.htmlcleaner.CleanerProperties;<br />import org.htmlcleaner.HtmlCleaner;<br />import org.htmlcleaner.PrettyXmlSerializer;<br />import org.htmlcleaner.TagNode;</p><p>/**<br /> *<br /> * @author Arjick@163.com<br /> */<br />public class HtmlClean {</p><p> public void cleanHtml(String htmlurl, String xmlurl) {<br /> try {<br /> long start = System.currentTimeMillis();</p><p> HtmlCleaner cleaner = new HtmlCleaner();<br /> CleanerProperties props = cleaner.getProperties();<br /> props.setUseCdataForScriptAndStyle(true);<br /> props.setRecognizeUnicodeChars(true);<br /> props.setUseEmptyElementTags(true);<br /> props.setAdvancedXmlEscape(true);<br /> props.setTranslateSpecialEntities(true);<br /> props.setBooleanAttributeValues("empty");</p><p> TagNode node = cleaner.clean(new File(htmlurl));</p><p> System.out.println("vreme:" + (System.currentTimeMillis() - start));</p><p> new PrettyXmlSerializer(props).writeXmlToFile(node, xmlurl);</p><p> System.out.println("vreme:" + (System.currentTimeMillis() - start));<br /> } catch (IOException e) {<br /> e.printStackTrace();<br /> }<br /> }<br />}<br />
以上代碼大家一起分享,有什麼看法,大家要提出溝通。希望以上代碼有助於大家開發一個資料採礦程式。