做了一段时间的网页解析的工作,有了些体会,写出来和大家分享。
现在流行的HTML解析工具主要有HTML Parser和nekohtml,我就不细介绍他们了,有兴趣的话可以自己google。个人比较喜欢用nekohtml+xerces,xerces实际上也是一个XML的解析包,nekohtml建筑在其之上,两者搭配后可将网页解析成一颗DOM树,这样我们对于网页的操作就转化为对这棵树的操作了,而这正是它和HTML Parser的不同之处,也是我喜欢它的原因。
我们对网页的操作主要通过org.w3c.dom中提供的接口(nekohtml+xerces提供这些接口的实现),熟悉XML解析的朋友对这个包一定不会陌生。这个包中用的比较多的接口有:Node、Document、Element、Text等。Node是DOM树中所有节点根接口,它的子接口有Document、ProcessingInstruction、Element、Comment、Text等,具体的继承层次请参考java doc。正如这些接口的名字说显示的,它们对应于DOM树中相应的元素,这里我就不细说了,下面我们通过一个例子来说明它们的使用方法。
从网页中抽取文本是一项很平常的工作,HTML Parser中提供了一个TextExtractingVisitor来实现这一点,但nekohtml没有现成这样的类,我们自己写一个也不难:
import java.io.BufferedReader;
import java.io.FileReader;
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class Demo {
public static String TextExtractor(Node root){
//若是文本节点的话,直接返回
if (root.getNodeType() == Node.TEXT_NODE) {
return root.getNodeValue().trim();
}
if(root.getNodeType() == Node.ELEMENT_NODE) {
Element elmt = (Element) root;
//抛弃脚本
if (elmt.getTagName().equals("STYLE")
|| elmt.getTagName().equals("SCRIPT"))
return "";
NodeList children = elmt.getChildNodes();
StringBuilder text = new StringBuilder();
for (int i = 0; i < children.getLength(); i++) {
text.append(TextExtractor(children.item(i)));
}
return text.toString();
}
//对其它类型的节点,返回空值
return "";
}
public static void main(String[] args) throws Exception{
//生成html parser
DOMParser parser = new DOMParser();
//设置网页的默认编码
parser.setProperty(
"http://cyberneko.org/html/properties/default-encoding",
"gb18030");
//input file
BufferedReader in = new BufferedReader(new FileReader("input.htm"));
parser.parse(new InputSource(in));
Document doc = parser.getDocument();
//获得body节点,以此为根,计算其文本内容
Node body = doc.getElementsByTagName("BODY").item(0);
System.out.println(TextExtractor(body));
}
}
除了提供DOM接口外,nekohtml还有一些其他功能,如格式化网页文本、确保网页格式良好(well-formed)等,具体可参见nekohtml的文档。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhou2002/archive/2008/01/19/2053911.aspx
分享到:
相关推荐
Neko-Img发电机简易的NEKO IMAGE生成器安装您需要使用npm install进行安装。 您需要使用Electron( npm install electron )来打开此应用程序( electron . )。 并享受这个程序!演示版
该存储库包含用于简单测试ROM的文件,该文件演示了如何使用。 检查链接以获取有关库例程的更多详细信息。 构建测试ROM 有一个makefile应该照顾它。 简单克隆代码并使用make进行构建: $ git clone --recursive ...
猫子 一个为保护隐私而设计的简单聊天应用程序。 项目设置 npm install 编译和热重装以进行开发 npm run serve 编译并最小化生产 npm run build 整理和修复文件 npm run lint 自定义配置 请参阅。
简单房间管理系统。 如何开始 您需要安装Docker和docker-compose 。 步骤1 将.env.example复制到.env并进行自定义。 cp .env.example .env 第2步 运行启动docker compose堆栈。 docker-compose up -d 停止3 使用...
自写的简单脚本,实验所用 脚本一键执行 系统分析工具的工具箱 查看IP地址、显示用户信息、显示系统平均负载、显示系统时间并且自动对时、换源、永久关闭防火墙及临时关闭selinux等等十多个功能
自写的简单脚本,实验所用 之前的升级版
Neko 使用 s-expression 作为其语法。 Neko 源代码可以写在引用的球拍列表中。 类型 Type ::= '* | Type '-> Type ('-> Type)* | '( Type ') 注意:函数类型是右结合的, t1 -> t2 -> t3等价于t1 -> (t2 -> t3) ...
猫武士龙战士+猫去做: 触摸/鼠标支持使用单选按钮添加 Neko 艺术以更改精灵敌人让 PC 追逐光标/敌人(需要简单的路径查找)
简单的 nsfw discord bot 使用 Nekos.life 包装器和 discord.js 的非常简单的 nsfw discord bot安装 You have to install NodeJS and Git.Create a folder.Open Command Promt.Type in: cd The path to your new ...
pet_cursor.js 宠物光标(Neko光标)是一个简单JavaScript文件,可将您网站的光标变成可爱的动画宠物! (对于台式机) 现在,您的桌面访问者可以在浏览您的网站时扮演可爱的角色! 默认角色基于,您可以使用此默认...
使用Nekos.life包装器和discord.js的非常简单的nsfw discord机器人 安装 You have to install NodeJS and Git. Create a folder. Open Command Promt. Type in: cd The path to your new folder. (Example: C:\Users...
Neko-Box是一个简单的GitHub Action,旨在使动态Gist显示来自AniList的最新活动。 :party_popper: 用法首先,您需要准备一些事情: 在创建一个新的公共GitHub Gist 与创建一个访问令牌gist范围和保存。 您可以在...
easyVM是一个简单的虚拟机。 0.1版本只支持8086指令集和一些简单的I/O设备,只支持英文文本显示方式。 0.2版本主要是在0.1版基础上加了一小部分32位指令(push eax等),使得easyVM可以运行MS-DOS 6.22自带的...
NekoTools 服务器脚本 (win)安装创建一个用于存储脚本的文件夹,并将文件NekoToolsServer.bat和NekoToolsServer.reg放入其中。 将NekoToolsServer.reg 中的文件路径(在C:\my\path\to \NekoToolsServer.bat\ 下面)...
此资产为使用装备好的手臂来面对目标的角色提供了一种简单有效的解决方案。 插件包含在Neko Legends Dynamic Bundle I中 除非安装了免费的共享资产演示依赖项,否则演示场景将无法运行。 请注意,此包仅包含代码;...
Openfl-Neko(使用-Dlegacy标志) Luxe-网站 豪华-Windows #### Donsole-online您可以尝试dconsole。 ####安装 haxelib install dconsole ####入门 使用dconsole很简单: import pgr.dconsole.DC ; DC ....
它是一个扩展功能,可以更轻松地使用buta-neko工具的de-kensaku。 它是一个扩展功能,在打开新选项卡时会自动重定向到“ de-kensaku”(https://buta-neko-tools.com/de-kensaku)。 “ de-kensaku”是buta-neko工具...
"neko" , "shinobu" , "bully" , "cry" , "hug" , "kiss" , "lick" , "pat" , "smug" , "highfive" , "nom" , "bite" , "slap" , "wink" , "poke" , "dance" , "cringe" , "blush" , "random" ]...
OpenFL构建为本机C ++,Neko或Flash字节码或JavaScript,从而实现了最大的兼容性和运行时性能。 OpenFL依赖 ,后者具有易于使用的命令行工具,并提供后端支持。 平台类 当前,OpenFL支持以下平台: 的iOS 安卓 ...
matlab最简单的代码mal-做一个Lisp 描述 Mal是一位受Clojure启发的Lisp口译员。 Mal采用73种语言实现: 艾达 GNU AWK 打击壳 BASIC(C64和QBasic) C C ++ C# 楚克 普通口齿不清 Clojure(Clojure和ClojureScript)...