HTMLParser遍历了网页的内容以后,以树(森林)结构保存了结果。HTMLParser访问结果内容的方法有两种。使用Filter和使用Visitor。
下面介绍使用Visitor访问内容的方法。
4.1 NodeVisitor
从简单方面的理解,Filter是根据某种条件过滤取出需要的Node再进行处理。Visitor则是遍历内容树的每一个节点,对于符合条件的节点进行处理。实际的结果异曲同工,两种不同的方法可以达到相同的结果。
下面是一个最常见的NodeVisitro的例子。
测试代码:
public static void main(String[] args) {
try{
Parser parser = new Parser( (HttpURLConnection) (new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() );
NodeVisitor visitor = new NodeVisitor( false, false ) {
public void visitTag(Tag tag) {
message("This is Tag:"+tag.getText());
}
public void visitStringNode (Text string) {
message("This is Text:"+string);
}
public void visitRemarkNode (Remark remark) {
message("This is Remark:"+remark.getText());
}
public void beginParsing () {
message("beginParsing");
}
public void visitEndTag (Tag tag){
message("visitEndTag:"+tag.getText());
}
public void finishedParsing () {
message("finishedParsing");
}
};
parser.visitAllNodesWith(visitor);
}
catch( Exception e ) {
e.printStackTrace();
}
}
输出结果:
beginParsing
This is Tag:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
This is Text:Txt (121[0,121],123[1,0]): \n
This is Text:Txt (244[1,121],246[2,0]): \n
finishedParsing
可以看到,开始遍历所以的节点以前,beginParsing先被调用,然后处理的是中间的Node,最后在结束遍历以前,finishParsing被调用。因为我设置的 recurseChildren和recurseSelf都是false,所以Visitor没有访问子节点也没有访问根节点的内容。中间输出的两个\n就是我们在HTMLParser使用详解(1)- 初始化Parser 中讨论过的最高层的那两个换行。
我们先把recurseSelf设置成true,看看会发生什么。
NodeVisitor visitor = new NodeVisitor( false, true) {
输出结果:
beginParsing
This is Tag:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
This is Text:Txt (121[0,121],123[1,0]): \n
This is Tag:head
This is Text:Txt (244[1,121],246[2,0]): \n
This is Tag:html xmlns="http://www.w3.org/1999/xhtml"
finishedParsing
可以看到,HTML页面的第一层节点都被调用了。
我们再用下面的方法调用看看:
NodeVisitor visitor = new NodeVisitor( true, false) {
输出结果:
beginParsing
This is Tag:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
This is Text:Txt (121[0,121],123[1,0]): \n
This is Tag:meta http-equiv="Content-Type" content="text/html; charset=gb2312"
This is Text:Txt (204[1,81],229[1,106]): 白泽居-title-www.baizeju.com
visitEndTag:/title
visitEndTag:/head
This is Text:Txt (244[1,121],246[2,0]): \n
This is Text:Txt (289[2,43],291[3,0]): \n
This is Text:Txt (298[3,7],300[4,0]): \n
This is Text:Txt (319[4,19],322[5,1]): \n\t
This is Text:Txt (342[5,21],346[6,2]): \n\t\t
This is Remark:这是注释 白泽居-www.baizeju.com
This is Text:Txt (378[6,34],408[8,0]): \n\t\t白泽居-字符串1-www.baizeju.com\n
This is Text:Txt (441[8,33],465[8,57]): 白泽居-链接文本-www.baizeju.com
visitEndTag:/a
This is Text:Txt (469[8,61],472[9,1]): \n\t
visitEndTag:/div
This is Text:Txt (478[9,7],507[11,0]): \n\t白泽居-字符串2-www.baizeju.com\n
visitEndTag:/div
This is Text:Txt (513[11,6],515[12,0]): \n
visitEndTag:/body
This is Text:Txt (522[12,7],524[13,0]): \n
visitEndTag:/html
finishedParsing
可以看到,所有的子节点都出现了,除了刚刚例子里面的两个最上层节点This is Tag:head和This is Tag:html xmlns="http://www.w3.org/1999/xhtml"。
想让它们都出来,只需要
NodeVisitor visitor = new NodeVisitor( true, true) {
输出结果:
beginParsing
This is Tag:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
This is Text:Txt (121[0,121],123[1,0]): \n
This is Tag:head
This is Tag:meta http-equiv="Content-Type" content="text/html; charset=gb2312"
This is Tag:title
This is Text:Txt (204[1,81],229[1,106]): 白泽居-title-www.baizeju.com
visitEndTag:/title
visitEndTag:/head
This is Text:Txt (244[1,121],246[2,0]): \n
This is Tag:html xmlns="http://www.w3.org/1999/xhtml"
This is Text:Txt (289[2,43],291[3,0]): \n
This is Tag:body
This is Text:Txt (298[3,7],300[4,0]): \n
This is Tag:div id="top_main"
This is Text:Txt (319[4,19],322[5,1]): \n\t
This is Tag:div id="logoindex"
This is Text:Txt (342[5,21],346[6,2]): \n\t\t
This is Remark:这是注释 白泽居-www.baizeju.com
This is Text:Txt (378[6,34],408[8,0]): \n\t\t白泽居-字符串1-www.baizeju.com\n
This is Tag:a href="http://www.baizeju.com"
This is Text:Txt (441[8,33],465[8,57]): 白泽居-链接文本-www.baizeju.com
visitEndTag:/a
This is Text:Txt (469[8,61],472[9,1]): \n\t
visitEndTag:/div
This is Text:Txt (478[9,7],507[11,0]): \n\t白泽居-字符串2-www.baizeju.com\n
visitEndTag:/div
This is Text:Txt (513[11,6],515[12,0]): \n
visitEndTag:/body
This is Text:Txt (522[12,7],524[13,0]): \n
visitEndTag:/html
finishedParsing
哈哈,这下调用清楚了,大家在需要处理的地方增加自己的代码好了。
4.2 其他Visitor
HTMLParser还定义了几个其他的Visitor。HtmlPage,NodeVisitor,ObjectFindingVisitor,StringFindingVisitor,TagFindingVisitor,TextExtractingVisitor,UrlModifyingVisitor,它们都是NodeVisitor的子类,实现了一些特定的功能。笔者个人的感觉是没什么用处,如果你需要什么特定的功能,还不如自己写一个,想在这些里面找到适合你需要的,化的时间可能更多。反正大家看看代码就发现,它们每个都没几行真正有效的代码。
分享到:
相关推荐
单片机开发教程代码涉及多个方面,包括硬件连接、软件编程、调试与优化等。以下是一个基于51单片机的简单教程代码示例,以及相关的开发步骤和解释。 ### 一、硬件连接 在进行单片机开发之前,首先需要正确连接硬件。以51单片机为例,通常需要将单片机的各个引脚与外围设备(如LED灯、按键、传感器等)进行连接。以下是一个简单的硬件连接示例: 1. 将单片机的P1.0引脚与LED灯的正极相连,LED灯的负极接地。 2. 将单片机的P3.2、P3.3、P3.4、P3.5引脚分别与四个按键的一端相连,按键的另一端接地。 ### 二、软件编程 在进行软件编程时,需要选择合适的编程语言(如C语言)和编译环境(如Keil C51)。以下是一个简单的51单片机程序示例,用于控制LED灯的亮灭和按键的扫描: ```c #include <reg51.h> sbit LED = P1^0; // 定义LED灯连接的引脚 void delay(unsigned int time) { unsigned int i, j; for (i = 0; i < time; i++) {
《顶刊复现》(复现程度90%),Reinforcement Learning-Based Fixed-Time Trajectory Tracking Control for Uncertain Robotic Manipulators With Input Saturation,自适应强化学习机械臂控制,代码框架方便易懂,适用于所有控制研究爱好者。 ,《深度强化学习复现:自适应控制框架下的机械臂轨迹跟踪控制研究》,强化学习机械臂控制的自适应轨迹跟踪:高复现度与易懂代码框架研究报告,核心关键词:顶刊复现; 强化学习; 固定时间轨迹跟踪控制; 不确定机械臂; 输入饱和; 自适应控制; 代码框架; 控制研究爱好者。,《基于强化学习的机械臂固定时间轨迹跟踪控制:复现程度高达90%》
通过分析企业对于飘香水果购物网站的需求,创建了一个计算机管理飘香水果购物网站的方案。文章介绍了飘香水果购物网站的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本飘香水果购物网站管理员功能有,个人中心管理,用户管理,会员管理,会员卡管理,开通会员记录管理,积分管理,水果管理,购买水果订单管理,积分兑换管理,积分兑换记录管理,加积分记录管理,减积分记录管理。用户可以注册登录,在首页开通会员卡,查看水果,购买水果,查看水果信息,以及个人中心修改个人资料,在自己的后台查看自己的购买记录等。因而具有一定的实用性。 本站是一个B/S模式系统,采用Spring Boot框架作为开发技术,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得飘香水果购物网站管理工作系统化、规范化。 关键词:飘香水果购物网站;Spring Boot框架;MYSQL数据库
地区:全国都有。时间:近半年的都有,之前的需要查数据库。数据来源:百度慧眼 数据形式:含坐标的CSV点数据;SHP数据;TIFF栅格数据;多种数据形式可选。任意精度,10,30,50m均可。 价格:市为单位,每天有24个时间点。数据格式不同价格不同。 用途:城市/街道活力,人口统计,选址分析,商圈分析,活力分析等等。
1998-2022年各地级市第三产业占GDP比重/地级市第三产业占比数据(市辖区) 1、时间:1998-2022年 2、指标:地级市第三产业占GDP比重/地级市第三产业占比 3、来源:城市统计年鉴 4、范围:299个地级市 5、缺失情况:缺失情况与年鉴一致,表内附有年鉴第三产业占比原始数据,以2022年地级市名单进行统计整理,为市辖区数据
网站精美前端设计,使用jQuery+CSS开发,源码适用于参考学习使用。希望对你学习和开发有所帮助
本项目是基于SSM框架开发的固定设备资产管理系统,旨在实现企业资产全生命周期数字化管理。系统采用B/S架构,前端通过JSP、Vue等技术实现交互界面,后端以Spring、SpringMVC和MyBatis为核心框架构建业务逻辑层,数据库采用MySQL存储资产信息16。
内容概要:本文基于对称折叠、卷式折叠和环向折叠三种气囊折叠方式,通过虚拟试验平台,采用气囊试验、碰块试验和转向盘试验,深入分析了各种气囊折叠方式在两个阶段内的气压特性及其对乘员保护性能的影响。结果发现气囊的展开过程中存在两阶段特征(初期展开阶段为0~20ms,完全展开工作阶段为20~100ms),不同折叠层数会导致不同的展开阻力,影响展开时间和内部压力;特别是环向折叠方式因其展开阻力较小,能够更快且平稳地提供保护力,并且能在早期阶段对靠近模块的离位乘客施加较小的力量,适合于大体型正常坐姿的乘客保护;卷式折叠适用于小型体态乘客;而对称折叠则是标准体型乘客的最佳选择。 适合人群:从事车辆被动安全性研究的技术人员、安全系统工程师、交通安全领域的研究人员,以及对高级辅助驾驶技术和安全性能感兴趣的学术界人士和专业学生。 使用场景及目标:该研究表明,通过对不同气囊折叠方法的研究,能够指导实际产品优化设计,提升乘客保护性能,同时也有助于制定科学合理的法规和规范,确保乘客在突发交通事故条件下能够得到最大程度的安全保障。 其他说明:本研究由国家自然科学基金资助,并借助有限元程序LS-DYNA进行数值模拟
MATLAB gui界面设计 MATLAB图像处理 gui界面开发 傅立叶变,灰度图,二值化,直方图均衡,高通滤波器,低通滤波器,巴特沃斯滤波器,噪声处理,边缘检测 ,MATLAB图像处理与GUI界面开发:实现傅立叶变换及高级滤波算法应用与解析,MATLAB GUI界面开发及应用实践:图像处理、滤波与边缘检测的完整解决方案,MATLAB GUI界面设计; MATLAB图像处理; gui界面开发; 图像处理技术; 傅立叶变换; 图像灰度化; 二值化处理; 直方图均衡化; 滤波器(高通/低通/巴特沃斯); 噪声处理; 边缘检测。,MATLAB图像处理与GUI界面开发实践:高级图像处理技术与应用
资源的描述略
矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用
网站精美前端设计,使用jQuery+CSS开发,源码适用于参考学习使用。希望对你学习和开发有所帮助
Kotlin语言基础入门:Kotlin简介 在2019年Google I/O大会上,Google 宣布今后将优先采用 Kotlin 进行 Android 开发。 一,简介 Kotlin 是一种富有表现力且简洁的编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。 Google 列举的 Kotlin 的优势: • 富有表现力且简洁:可以使用更少的代码实现更多的功能。表达自己的想法,少编写样板代码。 • 更安全的代码:Kotlin 有许多语言功能,可帮助你避免null指针异常等常见编程错误。 • 可互操作:可以在 Kotlin 代码中调用 Java 代码,或者在 Java 代码中调用 Kotlin 代码。Kotlin 可完全与 Java 编程语言互操作。 • 结构化并发:Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理。 更重要的是,Jetpack Compose 仅支持 Kotlin,而不再支持 Java。 Google 提到多平台项目可使用 Kotlin 来开发。
本项目是基于JSP与JavaEE技术栈开发的传统文化学习系统,旨在通过数字化手段实现中华优秀传统文化的传承与创新。系统采用经典的MVC架构模式,后端通过Servlet处理业务逻辑,JSP动态生成交互页面,结合MySQL数据库存储用户信息、课程内容及学习记录等核心数据3。主要功能模块涵盖用户注册登录、课程分类学习(如诗词鉴赏、书法入门)、多媒体资源管理(含视频讲解与电子书库)、在线测试评估及社区互动交流等,支持管理员对课程体系和用户权限的集中管理16。开发过程中整合了文件上传、缓存优化等实用技术,前端界面采用响应式设计,适配PC端与移动端浏览。该项目不仅为传统文化爱好者提供系统化学习路径,也为教育工作者搭建了资源共享与教学管理平台,助力文化自信的培育37。毕设项目源码常年开发定制更新,希望对需要的同学有帮助。
资源的描述略
冷链物流路径优化与调度模型研究 - 遗传算法求解及应用
1998-2022年各地级市第二产业占GDP比重/地级市第二产业占比数据(市辖区) 1、时间:1998-2022年 2、指标:地级市第二产业占GDP比重/地级市第二产业占比 3、来源:城市统计NJ 4、范围:299个地级市 5、缺失情况:缺失情况与年鉴一致,表内附有年鉴第二产业占比原始数据,以2022年地级市名单进行统计整理,为市辖区数据
网站精美前端设计,使用jQuery+CSS开发,源码适用于参考学习使用。希望对你学习和开发有所帮助
复现Energy一区top之融合多策略的改进蜣螂优化算法,提供参考文献,改进如下: 1、Fuch和逆向学习策略混合 2、自适应步长 3、凸透镜成像策略 4、随机差分变异 ,复现Energy一区顶尖融合多策略改进蜣螂优化算法研究,包含Fuch与逆向学习混合策略等四大改进点参考文献,复现Energy一区顶尖融合多策略改进蜣螂优化算法研究,包含Fuch与逆向学习混合策略等四大改进点参考文献,一区top_Energy融合;多策略改进;蜣螂优化算法;Fuch逆向学习策略混合;自适应步长;凸透镜成像策略;随机差分变异;参考文献,基于改进多策略的蜣螂优化算法在Energy领域的应用与优化分析
本项目是基于SSM框架开发的少儿编程教育网站,旨在为儿童提供互动性强、资源丰富的在线编程学习平台。系统采用B/S架构,前端使用JSP技术实现动态页面展示,后端通过Spring、SpringMVC和MyBatis框架整合业务逻辑与数据交互,数据库采用MySQL存储用户信息、课程数据及学习记录134。