htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0。

下载地址http://sourceforge.net/projects/htmlparser/

在线APIhttp://www.ostools.net/apidocs/apidoc?api=HTMLParser

Filter就是对于结果进行过滤,取得需要的内容。HTMLParser在org.htmlparser.filters包之内一共定义了15个不同的Filter

AndFilter、CssSelectorNodeFilter、HasAttributeFilter、HasChildFilter、HasSiblingFilter、IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、NotFilter、OrFilter、RegexFilter、StringFilter 、TagNameFilter.

常用的几个过滤器说明 

TagNameFilter:   
是最容易理解的一个Filter,根据Tag的名字进行过滤

HasChildFilter: 
是返回有符合条件的子节点的节点,需要另外一个Filter作为过滤子节点的参数。

HasAttributeFilter:
可以匹配出包含制定名字的属性,或者制定属性为指定值的节点。HasParentFilter和HasSiblingFilter的功能与HasChildFilter类似。

StringFilter:    
这个Filter用于过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示

RegexFilter :   
根据正则表达式匹配节点.与LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中寻找匹配

NodeClassFilter: 
根据已定义的标签类获取节点

LinkStringFilter:
这个Filter用于判断链接中是否包含某个特定的字符串,可以用来过滤出指向某个特定网站的链接。

OrFilter:  
是结合几种过滤条件的'或'过滤器

AndFilter:     
是结合几种过滤条件的'与'过滤器

实例应用

NodeClassFilter过滤器实例

    /**
*
* 过滤页面中的标签信息
*
* @param url 要解析的url页面
* @param encoding 使用的字符编码
* @param tagclass
* 要或取得页面标签,如要获取页面中的超链接 值为LinkTag.class,要获取页面中图片链接,值为ImageTag.class
* 要传入的标签类为org.htmlparser.tags下的
*/
public static void nodeFilterTagClass(String url,String encoding,Class tagclass){
try {
Parser parser = new Parser();
parser.setURL(url);
if(null==encoding){
parser.setEncoding(parser.getEncoding());
}else{
parser.setEncoding(encoding);
}
//过滤页面中的链接标签
NodeFilter filter = new NodeClassFilter(tagclass);
NodeList list = parser.extractAllNodesThatMatch(filter);
for(int i=0; i<list.size();i++){
Node node = (Node)list.elementAt(i);
System.out.println("link is :" + node.toHtml());
} } catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; //获取页面中的<a href='xxx' [属性]>格式的链接
nodeFilterTagClass(url, "UTF-8", LinkTag.class); //或取页面中的<img src='xxx' [属性='属性值']>格式的链接
nodeFilterTagClass(url, "UTF-8", ImageTag.class); //或取页面<title>xxxx</title>标题
nodeFilterTagClass(url, "UTF-8", TitleTag.class); //获取页面<div [属性='属性值']> xxx</div>
//nodeFilterTagClass(url, "UTF-8", Div.class); }

程序运行结果:

TagNameFilter实例应用
是最容易理解的一个Filter,根据Tag的名字进行过滤

    /**
*
* 根据标签名过滤页面中的标签信息
*
* @param url 要解析的url页面
* @param encoding 使用的字符编码
* @param tagName 标签名
*/
public static void nodeFilterTagName(String url,String encoding,String tagName){
try {
Parser parser = new Parser();
parser.setURL(url);
if(null==encoding){
parser.setEncoding(parser.getEncoding());
}else{
parser.setEncoding(encoding);
}
//过滤页面中的链接标签
NodeFilter filter = new TagNameFilter(tagName);
NodeList list = parser.extractAllNodesThatMatch(filter);
for(int i=0; i<list.size();i++){
Node node = (Node)list.elementAt(i);
System.out.println("link is :" + node.toHtml());
} } catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; //获取页面中的<a href='xxx' [属性]>格式的链接
nodeFilterTagName(url, "UTF-8", "a"); //或取页面中的<img src='xxx' [属性='属性值']>格式的链接
nodeFilterTagName(url, "UTF-8", "img"); //获取页面中的<div>链接
//nodeFilterTagName(url, "UTF-8", "div"); }

程序运行结果同上

StringFilter实例应用
过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示

    /**
* 过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示
*
* @param url 请求处理的url
* @param encoding 字符编码
* @param containStr包含的指定内容
*/
public static void stringFilter(String url,String encoding,String containStr){
try {
Parser parser = new Parser();
parser.setURL(url);
if(null==encoding){
parser.setEncoding(parser.getEncoding());
}else{
parser.setEncoding(encoding);
}
//OrFilter是结合几种过滤条件的‘或’过滤器
NodeFilter filter = new StringFilter(containStr);
NodeList list = parser.extractAllNodesThatMatch(filter);
for(int i=0; i<list.size();i++){
Node node = (Node)list.elementAt(i);
System.out.println("link is :" + node.toHtml());
} } catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
stringFilter(url, "UTF-8", "img.baidu.com"); }

程序运行结果

OrFilter实例应用
OrFilter是结合几种过滤条件的‘或’过滤器,与此相反的是AndFilter,AndFilter是集合几个过滤条件的‘与’过滤器

    /**
* OrFilter是结合几种过滤条件的‘或’过滤器
*
* 一般主题信息包含在下列标签中:<table>、<tr>、<td>、<p>、<div>等。如果要过滤出这些节点标签,可以使用OrFilter过滤器
*
* @param url 请求处理的url
* @param encoding 使用的字符编码
* @param filters 多个过滤器数组
*/
public static void orMultiFilter(String url,String encoding,NodeFilter[] filters){
try {
Parser parser = new Parser();
parser.setURL(url);
if(null==encoding){
parser.setEncoding(parser.getEncoding());
}else{
parser.setEncoding(encoding);
}
//OrFilter是结合几种过滤条件的‘或’过滤器
NodeFilter filter = new OrFilter(filters);
NodeList list = parser.extractAllNodesThatMatch(filter);
for(int i=0; i<list.size();i++){
Node node = (Node)list.elementAt(i);
System.out.println("link is :" + node.toHtml());
} } catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
//过滤多个标签 或关系
NodeFilter[] filters = new NodeFilter[3];
filters[0] = new NodeClassFilter(TableTag.class);
filters[1] = new NodeClassFilter(ParagraphTag.class);
filters[2] = new NodeClassFilter(ImageTag.class);
orMultiFilter(url, "UTF-8", filters); }

程序运行结果:

RegexFilter与LinkRegexFilter实例应用
RegexFilter根据正则表达式匹配节点.与LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中寻找匹配

    /**
* 在文本中通过正则进行匹配
*
* @param url 请求处理的url
* @param encoding 字符编码
* @param regex 待匹配的正则表达式
*/
public static void regexStringFilter(String url,String encoding,String regex){
try {
Parser parser = new Parser();
parser.setURL(url);
if(null==encoding){
parser.setEncoding(parser.getEncoding());
}else{
parser.setEncoding(encoding);
}
//OrFilter是结合几种过滤条件的‘或’过滤器
NodeFilter filter = new RegexFilter(regex);
NodeList list = parser.extractAllNodesThatMatch(filter);
for(int i=0; i<list.size();i++){
Node node = (Node)list.elementAt(i);
System.out.println("link is :" + node.toHtml());
} } catch (Exception e) {
e.printStackTrace();
}
} /**
* 在链接地址中进行正则匹配,返回的是Link结点
*
* @param url 请求url
* @param encoding 字符编码
* @param regex 待匹配的正则表达式
*/
public static void linkTagRegexFilter(String url,String encoding,String regex){
try {
Parser parser = new Parser();
parser.setURL(url);
if(null==encoding){
parser.setEncoding(parser.getEncoding());
}else{
parser.setEncoding(encoding);
}
//OrFilter是结合几种过滤条件的‘或’过滤器
NodeFilter filter = new LinkRegexFilter(regex);
NodeList list = parser.extractAllNodesThatMatch(filter);
for(int i=0; i<list.size();i++){
Node node = (Node)list.elementAt(i);
System.out.println("link is :" + node.toHtml());
} } catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) { String url = "F:/dennisit/email.txt"; String emailRegex = "[a-zA-Z0-9_-]+@\\w+\\.[a-z]+(\\.[a-z]+)?";
regexStringFilter(url, "UTF-8", emailRegex);
System.out.println("-------------------------------------------");
linkTagRegexFilter(url, "UTF-8", emailRegex); }

程序运行结果

HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容的更多相关文章

  1. 【AMAD】newspaper -- 爬取/提取新闻网页中的文本,元数据

    动机 简介 用法 源码分析 个人评分 动机 新闻网页,结构大多是类似的. 所以,能不能用一种通用的爬取方法来提取其中的数据? 简介 Newspapaer1受到requests那种简单性API的启发,通 ...

  2. scrapy-redis + Bloom Filter分布式爬取tencent社招信息

    scrapy-redis + Bloom Filter分布式爬取tencent社招信息 什么是scrapy-redis 什么是 Bloom Filter 为什么需要使用scrapy-redis + B ...

  3. python连续爬取多个网页的图片分别保存到不同的文件夹

      python连续爬取多个网页的图片分别保存到不同的文件夹 作者:vpoet mail:vpoet_sir@163.com #coding:utf-8 import urllib import ur ...

  4. python网络爬虫之使用scrapy自动爬取多个网页

    前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面 ...

  5. 爬取CVPR 2018过程中遇到的坑

    爬取 CVPR 2018 过程中遇到的坑 使用语言及模块 语言: Python 3.6.6 模块: re requests lxml bs4 过程 一开始都挺顺利的,先获取到所有文章的链接再逐个爬取获 ...

  6. Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫

    如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:P ...

  7. Node JS爬虫:爬取瀑布流网页高清图

    原文链接:Node JS爬虫:爬取瀑布流网页高清图 静态为主的网页往往用get方法就能获取页面所有内容.动态网页即异步请求数据的网页则需要用浏览器加载完成后再进行抓取.本文介绍了如何连续爬取瀑布流网页 ...

  8. Python 爬虫练习: 爬取百度贴吧中的图片

    背景:最近开始看一些Python爬虫相关的知识,就在网上找了一些简单已与练习的一些爬虫脚本 实现功能:1,读取用户想要爬取的贴吧 2,读取用户先要爬取某个贴吧的页数范围 3,爬取每个贴吧中用户输入的页 ...

  9. 初识python 之 爬虫:使用正则表达式爬取“古诗文”网页数据

    通过requests.re(正则表达式) 爬取"古诗文"网页数据. 详细代码如下: #!/user/bin env python # author:Simple-Sir # tim ...

随机推荐

  1. windows 安装 setuptools

    在python的网站上 : https://pypi.python.org/pypi/setuptools/ 查找windows,显不如下: 点击 ez_setup.py进入, 并将内容复制下来, 保 ...

  2. svn 钩子 post-commit 出现255错误解决办法

    首先检查代码中是否有可执行命令 #!/bin/sh 然后 检查post-commit权限 post-commit 脚本文件的权限不对,post-commit 脚本必须有 +x 权限. chown sv ...

  3. 在Mac OS X中使用VIM开发STM32(3)

    本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重!       在上一篇文章中,我们安装了ctags插件,ctags能对我们的源代码文件中的元素建立索引表, ...

  4. QtSQL学习笔记(1)- 概述

    Qt SQL是Qt提供的核心模块,用以支持SQL数据库.Qt SQL的API被分为不同的层: ■ 驱动层 (Driver layer) ■ API层 (SQL API layer) ■ 用户接口层 ( ...

  5. 一个基于集成jenkins的测试平台

    (一)先看测试业务的情况: 有各种各样的任务包括代码构建.部署搭建.单元测试.功能自动化测试(包括许多模块的功能自动化测试,有十几个居多),性能测试.正确性验证:复杂一点的是这些任务在不同的测试阶段中 ...

  6. Python 列表实现字典的get功能

    字典有一个很好用的方法,就是get,既可以预防KeyError异常,也可以为不存在的key设置一个默认的value 例如: v=d.get('k','default') 而列表没有一个类似的方法,如果 ...

  7. C语言小结之结构类型

    C语言小结之结构类型 @刁钻的游戏 (1)枚举型类型enum COLOR {BLACK,RED,BLUE};//声明一种新的数据类型,其值分别为0,1,2但是用BLACK/RED/BLUE代表也可以这 ...

  8. css helper class

    应该习惯的css helper class .text-centered text-align: center; .text-right text-align: right; .small small ...

  9. 拖尾渲染器 Trail Renderer

    拖尾渲染器(Trail Renderer)用于制作跟在场景中的物体后面的拖尾效果来代表它们在到处移动. 必须给Materials一个材质渲染器设置的Colors才有效. 展示自己的一个demo...

  10. 获取iOS设备型号的方法总结

    三种常用的办法获取iOS设备的型号: 1. [UIDevice currentDevice].model (推荐): 2. uname(struct utsname *name) ,使用此函数需要#i ...