JAVA分析html算法(JAVA网页蜘蛛算法)
近来有些朋友在做蜘蛛算法,或者在网页上面做深度的数据挖掘。但是遇到复杂而繁琐的html页面大家都望而却步。因为很难获取到相应的数据。
最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费我们宝贵的时间。
第二个办法用开源组织htmlparser的包,这个是一个比较老的项目,但是效果估计不是很好,好像不可以深入分析html,只能分析5级的结构;
我这里有个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; /**
*
* @author Arjick@163.com
*/
public class GetLinkTest { public static void main(String[] args) { try {
// 通过过滤器过滤出<A>标签
Parser parser = new Parser("http://www.lovezan.com");
NodeList nodeList = parser.extractAllNodesThatMatch(new NodeFilter() {
// 实现该方法,用以过滤标签
public boolean accept(Node node) {
if (node instanceof LinkTag)// 标记
{
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.zuzwn.com")) {
System.out.println(n.extractLink());
}
} catch (Exception e) {
}
}
} catch (Exception e) {
e.printStackTrace();
} }
}
第三个办法,也是我现在一直在用的办法,首先把html清理为xml,然后用java解析xml获取数据,现在上传一个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分析html算法(JAVA网页蜘蛛算法)的更多相关文章
- 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)
一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...
- 八大排序算法——希尔(shell)排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插 ...
- 八大排序算法——插入排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 例如从小到大排序: 1. 从第二位开始遍历, 2. 当前数(第一趟是第二位数)与前面的数依次比较,如果前面的数大于当前数,则将这个数放在当前数的位置上,当前数的下标-1 ...
- 八大排序算法——堆排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 先来了解下堆的相关概念:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如 ...
- 八大排序算法——基数排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演 二.思路分析 基数排序第i趟将待排数组里的每个数的i位数放到tempj(j=1-10)队列中,然后再从这十个队列中取出数据,重新放到原数组里,直到i大于待排数的最大位数. 1.数组里的数最 ...
- 八大排序算法——归并排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 归并排序就是递归得将原始数组递归对半分隔,直到不能再分(只剩下一个元素)后,开始从最小的数组向上归并排序 1. 向上归并排序的时候,需要一个暂存数组用来排序, 2. 将 ...
- 八大排序算法——快速排序(动图演示 思路分析 实例代码Java 复杂度分析)
一.动图演示 二.思路分析 快速排序的思想就是,选一个数作为基数(这里我选的是第一个数),大于这个基数的放到右边,小于这个基数的放到左边,等于这个基数的数可以放到左边或右边,看自己习惯,这里我是放到了 ...
- 八大排序算法——冒泡排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 1. 相邻两个数两两相比,n[i]跟n[j+1]比,如果n[i]>n[j+1],则将连个数进行交换, 2. j++, 重复以上步骤,第一趟结束后,最大数就会被确定 ...
- Java面试题 Web+EJB & Spring+数据结构& 算法&计算机基础
六.Web 部分:(共题:基础40 道,基础37 道,中等难度3 道) 122.说出Servlet 的生命周期,并说出Servlet 和CGI 的区别? [基础] 答:Web 容器加载Servlet ...
随机推荐
- UBoot常用命令手册
UBoot常用命令手册 U-Boot还提供了更加详细的命令帮助,可以通过”?”显示支持的命令列表,通过help [CommandName]命令还可以查看每个命令的参数说明. 1.bootm bootm ...
- HTML发展历史
概述 HTML从1993到如今的发展,同时针对其以后的发展进行评测. HTML 语言作为网络语言标准规范,在计算机的发展史中有着不可或缺的地位.在HTML 上的成就也决定着一个时代的发展. 1.HTM ...
- the specified child alread has a parent
用 TestFragment extends Fragment @Override public View onCreateView(LayoutInflater inflat ...
- poj2891
这道题就是扩展的中国剩余定理(模数不互质) 首先我们回忆一下中国剩余定理对于给定n个方程组x≡ai(mod pi) 令m=∏pi wi=m/pi,然后求解关于hi,ri的方程wi*hi+pi*ri=1 ...
- 用Visio画UML用例图
1.用例图 用例图描述参与者所理解的系统功能.主要元素是用例和参与者. 用例图的4个基本组件:参与者(Actor).用例(Use Case).关系(Relationship)和系统. 下面以银行储蓄系 ...
- WEBUS2.0 In Action - 搜索操作指南 - (4)
上一篇:WEBUS2.0 In Action - 搜索操作指南(3) 6. 搜索多个索引 为了提升性能, 我们可以从多个索引同时进行搜索, Webus.Search.MultiSearcher提供了相 ...
- BZOJ 1078 斜堆
感谢MATO大神的博客 http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html 注意细节. #include<iostream ...
- Calculate drive total/free/available space
using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Consol ...
- 20160203.CCPP体系详解(0013天)
程序片段(01):数组.c+02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h> //0 ...
- yaf框架流程四
在前面的章节,在bootstrap里添加了一个benchmark插件,简单介绍下yaf的插件机制:http://yaf.laruence.com/manual/yaf.plugin.html Yaf定 ...