HtmlParser的使用-爬虫学习(三)
关于这个HtmlParser的学习资料,网上真的很匮乏,这个好用的东西不要浪费啊,所以我在这里隆重的介绍一下。
HtmlParser是一个用来解析HTML文件的Java包,主要用于转换盒抽取两个方面。
利用HtmlParser,你可以实现下面的内容的抽取:
a.文本抽取 b.链接抽取 c.资源抽取。可以搜集到图像和声音文件等资源
d.链接检查。保证链接是有用的 e.站点检查,可以查看页面不同版本之间的差异
利用HtmlParser,你可以利用它的转换功能,主要体现在几个方面:
a.URL重写。能够修正页面中的错误链接 b.广告清楚。清除页面中的广告内容和指向广告的链接
c.将HTML页面转化成XML页面 d.HTML页面的清理
我们开始学习了,我们先来看看这个包中的类的大体框架:

在org.htmlparser包下,有几个接口和类:
Parser类:这个是HtmlParser的核心类,主要的完成对Html页面的分析工具,通过这个类我们可以得到这个页面的各种信息。
Parser():无参数的构造方法。
Parser(String resource):根据String参数构建对象,这个参数可以是URL或者本地文件的路径。
Parser(URLConnection connection):根据一个URLConnection对象构建对象。
createParser(String html, String charset):通过路径名创建对象,并且设置编码格式。
elements():返回这个类的元素节点的迭代器,通过这个迭代器我们遍历页面的节点。
setURL():设置这个Parser类要解析的页面的地址。
parset():根据一个NodeFilter,也就是一个过滤器去获取过滤剩下的页面信息。
visitAllNodeWith(NodeVisitor visitor):通过一个NodeVisitor去遍历所有的节点。
小试牛刀(这个只是简单的使用,具体的类看下面的介绍):
@Test
public void testVisitAllNodeWith() throws Exception {
Parser parser = new Parser();
parser.setURL("http://www.google.cn");
parser.setEncoding(parser.getEncoding());
NodeVisitor visitor = new NodeVisitor() {
public void visitTag(Tag tag) {
System.out.println("*************************");
System.out.println(tag.getTagName());
System.out.println("*************************");
}
};
parser.visitAllNodesWith(visitor); } @Test
public void testElements() throws Exception {
Parser parser = new Parser();
parser.setURL("http://www.google.cn");
parser.setEncoding(parser.getEncoding());
NodeIterator iterator = parser.elements();
while(iterator.hasMoreNodes()) {
Node node = iterator.nextNode();
System.out.println("*************************");
System.out.println(node.getText());
System.out.println("*************************");
}
}
Node接口:这个接口就好像定义了一颗树来表示一个HTML页面,定义获取父子兄弟节点的方法,定义了节点到对应节点的html文本的方法,从上面的图中我们看到有AbstractNode这个类,这个是Node的实现类,起到形成树形结构的作用,在HTML页面中有三种类型的Node,RemarkNode代表html中的注释,TagNode代表标签节点,TextNode代表文本节点。
getChildren():获取子节点,返回一个NodeList对象。
getFirstChildren():获取第一个子节点,返回一个Node对象。
getLastChildren():获取最后一个子节点,返回一个Node对象。
getPreviousSibling():获取前一个兄弟节点。
getNextSibling():获取后一个兄弟节点。
getParent():获取父节点。
getText():获得文本内容。
toPlainTextString():获取纯文本信息。
toHtml():获取Html信息。
accept(NodeVisitor visitor):对这个node应用visitor。
为了方法大家观看,还是自己写一个Html,然后练练方法:
node.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title Node</title>
</head>
<body>
<!-- remark -->
<h1>H1 Node</h1>
<div id="d1">
<div id="d2">
<a>Div Node</a>
</div>
</div>
</body>
</html>
测试方法:
@Test
public void testNode() throws Exception {
Parser parser = new Parser();
parser.setURL("src/node.html");
parser.setEncoding(parser.getEncoding());
NodeIterator iterator = parser.elements();
while(iterator.hasMoreNodes()) {
Node node = iterator.nextNode();
System.out.println("*************************");
System.out.println("Text:" + node.getText());
System.out.println("PlainText:" + node.toPlainTextString());
System.out.println("ToHtml:" + node.toHtml());
System.out.println("*************************");
}
}
Remark接口:这个接口代表了注释。实现类有RemarkNode,这个类代表了注释节点。
getText():获取文本。
setText():设置文本。
Tag接口:这个接口就代表了Html页面的标签,实现类有TagNode,就是标签节点。
getAttribute(String name):根据name拿到该标签的属性,当然有对应的setAttribute方法。
getTagName():拿到这个标签的名字。
toTagHtml():返回这个标签的html。
Text接口:这个接口代表Html的文本,实现类有TextNode,就是文本节点。
getText():拿到文本值。
setText():设置文本值。
NodeFilter接口:这个接口定义的是过滤器,通过各种各样的过滤器可以筛选出特定的节点,具体的应用看下面的org.htmlparser.filters包下的类的应用,
accept(Node node):这个方法的返回值是boolean,方法的作用就是判断要不要保留这个节点。
在org.htmlparser.visitors包下,有一个很重要的类NodeVisitor,下面讲解一下:
NodeVisitor类:通过这个visitor我们可以遍历树的每一个节点,对于一个符合条件的节点,我们还可以进行适当的处理。
visitRemarkNode(Remark remark):访问remark类型的节点,通过重写这个方法可以实现对这个remark类型节点的特定操作。
visitStringNode(Text text):访问Text类型的节点,通过重写这个方法可以实现对这个Text类型节点的特定操作。
visitTag(Tag tag):访问Tag类型的节点,通过重写这个方法可以实现对这个Tag类型节点的特定操作。
小试牛刀:
public class MyVisitor extends NodeVisitor{
public MyVisitor() {
}
public void visitTag(Tag tag) {
if(tag.getTagName().equals("BODY"))
System.out.println("**********body**************");
System.out.println("TagName:" + tag.getTagName());
}
public void visitStringNode(Text text) {
System.out.println("text" + text.getText());
}
public static void main(String[] args) throws Exception{
Parser parser = new Parser("src/node.html");
MyVisitor visitor = new MyVisitor();
parser.visitAllNodesWith(visitor);
}
}
在org.htmlparset.filters包下,有着很多过滤器,每个过滤器类都有自己特定的作用:
判断类Filter:
TagNameFilter
HasAttributeFilter
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
逻辑运算Filter:
AndFilter
NotFilter
OrFilter
XorFilter
其他Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
下面是一个关于TagNameFilter的小试牛刀:
@Test
public void testTagNameFilter() throws Exception{
Parser parser = new Parser("src/node.html");
NodeFilter filter = new TagNameFilter("DIV");
NodeList nodeList = parser.extractAllNodesThatMatch(filter);
if(nodeList != null) {
for(int i = 0; i < nodeList.size(); i++) {
Node node = nodeList.elementAt(i);
System.out.println("Text:" + node.getText());
System.out.println("****************************");
}
}
}
HtmlParser的使用-爬虫学习(三)的更多相关文章
- Python爬虫学习三------requests+BeautifulSoup爬取简单网页
第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...
- python爬虫学习(三):使用re库爬取"淘宝商品",并把结果写进txt文件
第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字“python”,然后搜索,显示如下搜索结果 从url连接中可以得到搜索商品的关键字是 ...
- day48-python爬虫学习三
Python的urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能.他们两个最显着的差异如下: urllib2可以接受一个Request对象,并以此可以来设置一个URL的h ...
- Python爬虫学习:三、爬虫的基本操作流程
本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...
- scrapy爬虫学习系列三:scrapy部署到scrapyhub上
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- python爬虫学习(1) —— 从urllib说起
0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...
- 爬虫学习之基于Scrapy的爬虫自动登录
###概述 在前面两篇(爬虫学习之基于Scrapy的网络爬虫和爬虫学习之简单的网络爬虫)文章中我们通过两个实际的案例,采用不同的方式进行了内容提取.我们对网络爬虫有了一个比较初级的认识,只要发起请求获 ...
- Python爬虫学习:二、爬虫的初步尝试
我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...
- 《Python爬虫学习系列教程》学习笔记
http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...
随机推荐
- ACM核武器
工欲善其事必先利其器,给大家介绍一下ACM里面经常使用的一些工具,平台,作为第一发福利. 详细看这里,我直接粘贴过来有些代码没贴过来 http://wuyiqi.net/house/acm_weap ...
- python 时间处理
在实践中,时间处理遇到的问题,需要 Sep 06, 2014 19:30 (UTC 时间) 和 比较当前时间,早晚.知道 此 2014-09-06 19:30 格时间表达式.因此,在处理,通缉 先将s ...
- 网络资源(5) - Android视频
2014_08_24 http://v.youku.com/v_show/id_XMjM5NjU2OTI0.html?f=5486194 Android开发视频教程1 http://v.youku.c ...
- IC设计前端到后端的流程和eda工具。
IC前端设计(逻辑设计)和后端设计(物理设计)的区分:以设计是否与工艺有关来区分二者:从设计程度上来讲,前端设计的结果就是得到了芯片的门级网表电路. 前端设计的流程及使用的EDA工具例如以下: 1.架 ...
- 測试之路2——对照XML文件1
才来几天,老大又给了我一个新的任务.不像曾经的建100个任务project那么坑爹,却还是顿时让我感觉压力山大. 由于在这之前,我改了他写的例程,用于生成新的任务项目,事实上任务项目就是通过XML文件 ...
- C++ Primer中文本查询演示样例Query的实现
近期在看C++ Primer复习C++的语法,看到书中15.9章中的文本查询演示样例时,认为设计得非常不错,于是便动手照着实现了一个,改动了非常久最终执行成功了,从中也学习到了非常多的语法.以下把实现 ...
- SDUT 1124-飞跃荒野(三维BFS)
飞跃原野 Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 勇敢的法里奥出色的完毕了任务之后.正在迅速地向自己的基地撤退.但因为 ...
- ASP.NET——RequiredFieldValidator控制和ValidationSummary控制
我们的登录页面,忘记承担损失password然后username,该页面将永远是一个小提醒. 那么我们在网也制作的时候怎样实现这一功能呢?这就用到了RequiredFieldValidator控件和V ...
- JS工具库之Lodash
破狼 JavaScript工具库之Lodash 2015-04-11 16:08 by 破狼, 235 阅读, 2 评论, 收藏, 编辑 你还在为JavaScript中的数据转换.匹配.查找等烦恼吗? ...
- net.sf.json 迄今 时刻 格式 办法
创作工具类 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import ...