不知大家是否已经注意到个人知客首页和列表页的文章已经实现了部分摘要内容的显示呢?这个看似简单的功能其实给我添了不少麻烦的说,前几天终于解决了,现在和大家一起分享一下经验,嘿嘿~~
普通的纯文本文字截取,大家想必已经很熟悉了,
java.lang.String.String(byte[] arg0, int arg1, int arg2)
就可以了,jsp里substring也能解决,但是加了HTML代码进去,想截取出一篇文章的部分内容就不那么容易,截取很容易就破坏了HTML代码的完整性,其后果甚至会影响你的整个页面的布局(我测试时候知客的页面就全飞了,恐怖ing)。
也考虑过将文章里的所有HTML语言全部过滤掉,这个曾经用在做SEO优化时META的Description内容,
replaceAll("<[.[^<]]*>","").replaceAll("[\\n|\\r]","")
就可以办到了,正则表达式<[.[^<]]*>可以粗略的过滤掉大部分的HTML标签,无疑这样做也可以达到摘要的目的,但是用户体验(UE)就差了很多了,大家肯定不愿意自己的图片,表格就这么从自己的首页里消失吧。
那么只有去分析文章的HTML标签了,把所有成对的标签都摘出来,以标签为单位去截取?或者截取后,对缺失的HTML标签进行补足,不管怎么样,这样的工作量和复杂度都是目前难以接受的(我得做一个准HTML代码语法分析器,汗~),时间不允许啊。。。
最后无意中发现一个强大的API HTML Parser,这是一个在 SourceForge.net 上比较活跃的项目之一,目前的最新版本是 1.4 发行版。有如 HTML Parser 网站的自我介绍: HTML Parser 是一个对现有的 HTML 进行分析的快速实时的解析器,事实上在应用过程中你更为惊叹于 HTML Parser 给你带来一些周到的处理。
下面是相关的资料和做法:
HTML Parser项目主要可以用在以下两个方面:
1. 信息提取
- 文本信息抽取,例如对HTML进行有效信息搜索
- 链接提取,用于自动给页面的链接文本加上链接的标签
- 资源提取,例如对一些图片、声音的资源的处理
- 链接检查,用于检查HTML中的链接是否有效
- 页面内容的监控
2. 信息转换
- 链接重写,用于修改页面中的所有超链接
- 网页内容拷贝,用于将网页内容保存到本地
- 内容检验,可以用来过滤网页上一些令人不愉快的字词
- HTML信息清洗,把本来乱七八糟的HTML信息格式化
- 转成XML格式数据
HTML Parser并没有对以上提到的一些应用进行专门的处理,但是它完全可以胜任上面提及的功能,在实际应用中如果遇见上面提及的问题可以使用该项目来处理。
解决问题
接下来我主要针对我们在前面提过那个网页截断的问题进行处理。我的做法是强行对HTML内容进行截断,然后把截断后的内容传递给HTML Parser,由它来补全缺漏的标签。这样做可能有些内容显示不全,但是至少不会破坏页面的排版。通过这样一个简单的例子可以了解HTML Parser的基本结构以及使用流程。
首先从SourceForge网站上下载HTML Parser的压缩包(下载网址参照文章最后的资料参考部分),下图是解压后的目录结构,其中画红线的是我们所需要的jar包文件。把这个文件加到项目的类路径中,其他类可以不管!
/**
* 获取HTML的预览信息,其中content是对象的一个属性,也就是待处理的HTML内容
* @return
*/
public String getPreviewContent(){
//截取前N个字符
String ct = StringUtils.left(content,MAX_COUNT);
//对一些未完成的标签先补齐,避免出现例如<tab这样的标签
if(ct!=null&&content!=null) {
int idx2 = ct.lastIndexOf('>');
int idx1 = ct.lastIndexOf('<');
if((idx2==-1 && idx1>=0) || idx1 > idx2) {
String ct2 = content.substring(ct.length());
int idx3 = ct2.indexOf('>');
if(idx3!=-1 && idx3<(MAX_COUNT2-MAX_COUNT)) {
ct += content.substring(ct.length(),ct.length()+idx3+1);
}
}
}
//对于一些页面嵌入了ActiveX对象进行预处理
if(ct!=null&&content!=null) {
int idx2 = ct.toLowerCase().lastIndexOf("</object>");
int idx1 = ct.toLowerCase().lastIndexOf("<object");
if((idx2==-1 && idx1>=0) || idx1 > idx2) {
String ct2 = content.substring(ct.length()).toLowerCase();
int idx3 = ct2.indexOf("</object>");
if(idx3!=-1)
ct += content.substring(ct.length(),ct.length()+idx3+9);
else
ct = ct.substring(0,idx1);
}
}
if(ct!=null&&content!=null) {
Parser parser = Parser.createParser(new String(ct.getBytes(),ISO8859_1));
//中文信息必须转码后方可传入
Node [] tables = parser.extractAllNodesThatAre (TableTag.class);
if(tables!=null&&tables.lengtd>0) {
TableTag tableTag = (TableTag)tables[0];
ct = ct.substring(0,tableTag.getStartPosition())
+ new String(tableTag.toHtml().getBytes(ISO8859_1));
//处理后的数据转回GBK的编码
}
}
return ct;
}
|
上面这段代码就是用于显示HTML概要信息的方法,其中粗体部分是使用HTML Parser进行处理的过程。类Parser是HTML Parser的入口,我们可以将HTML文本信息传入给它,或者可以直接传递一个URL地址,如下:
Parser parser = new Parser("http://www.javayou.com");
|
初始化一个Parser实例后,紧接着就是对所传入的HTML内容进行解析,大家注意红色粗体的那行代码,从方法名我们很容易理解,该方法就是将HTML内容中存在的所有的表格给解析出来放到一个数组去,该方法所需的参数就是节点的类型,我们这里用的是表格的标签,几乎HTML的标签中都有对应的一个对应的类,比如FormTag、InputTag、AppletTag等等,这些标签类都在org.htmlparser.tags包中。根据我们要处理不同的标签传入不同的类,这种做法使我们可以很方便的处理其他类型的标签。返回的数组中每个元素都是你传入类的一个实例,通过这个实例可以访问到当前这个标签的起始未知、结束标签的未知以及包含在标签中的文本信息,同时也可以访问其父标签以及所有的子标签等等,同时我们可以通过toHtml方法来对标签中包含的HTML信息进行清洗,HTML
Parser会自动帮我们把一些没有关闭的标签加上,这样所生成的字符串中就包含着完整的格式控制信息,在页面上显示这样的信息也不会破坏版面布局,达到了我预期的效果。
为了使大家更直观的看到执行效果,我们再来一个小例子并附上执行的结果:
public static void main(String[] args) throws Exception {
//不完整格式的HTML信息
String html = "我们是害虫<table>1234567890<table>lk你好中国";
Parser parser = Parser.createParser(new String(html.getBytes(),"8859_1"));
Node [] tables = parser.extractAllNodesThatAre (TableTag.class);
for (int i = 0; i < tables.length; i++) {
TableTag tableTag = (TableTag)tables[i];
//打印出结束标签所在的未知
System.out.println("END POS:"+tableTag.getEndTag().getEndPosition());
//补齐未结束的标签并打印
System.out.println(new String(tableTag.toHtml().getBytes("8859_1")));
}
}
|
这段代码旨在找出一段不完整 HTML 信息中的所有表格标签,然后打印出经过格式化后的 HTML 信息,下图是在 Eclipse 环境下的执行结果。
为了更好的在实际的业务中应用HTML Parser 项目,HTML Parser 还提供了几个例子用于处理前面我们提到的功能实现。这些例子在解压目录下的 bin 都有批处理命令可以执行,执行时给命令传入 URL 地址或者是 html 文件的路径即可。
HTML Parser 项目仅仅是提供给我们一个简单而强健的 API 用于分析 HTML 文本信息,更多的应用模式还有待于我们自己去发掘,希望本文能将你引入 HTML Parser 的大门
分享到:
相关推荐
2. **创建FFmpeg实例**:在Java代码中,首先需要创建一个`org.bytedeco.javacpp.Loader`的实例,然后加载`ffmpeg`的库。这样可以确保FFmpeg的动态链接库被正确加载。 ```java import org.bytedeco.javacpp.Loader; ...
人脸识别代码实现,截取图片脸部进行检测人脸识别代码实现,截取图片脸部进行检测 人脸识别代码实现,截取图片脸部进行检测人脸识别代码实现,截取图片脸部进行检测 人脸识别代码实现,截取图片脸部进行检测人脸识别...
本文将深入探讨如何使用Java实现远程控制功能,并结合提供的源代码进行解析。 首先,Java作为一种跨平台的编程语言,拥有丰富的库和API,能够方便地实现网络通信和多线程操作,这为构建远程控制应用提供了坚实的...
在本项目中,"纯Java实现整个网页截图项目源代码" 是一个利用Java编程语言来实现的实用程序,它能够捕获整个网页的图像并将其保存为图片文件。这个项目的核心在于利用DJNativeSwing组件,这是一个开源的Java库,它...
### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...
这样,Java代码可以调用FFmpeg的函数,执行多媒体操作,而无需离开Java虚拟机。Jave项目可能是其中一个已经封装好的库,允许开发者通过简单的Java API来调用FFmpeg的功能。 1. **视频截图**:使用Java封装的FFmpeg...
标签“源码”和“工具”暗示了这是一个具有实用性的项目,可能包含一个完整的Java源代码实现。在压缩包`src`中,很可能包含了这个项目的源代码文件,如`.java`文件,它们可能包含了上述逻辑的实现。开发者可以通过...
以上就是使用HTMLParser库截取HTML摘要的基本步骤。请注意,这只是一个基础示例,实际应用中可能需要根据网页结构的复杂性进行更复杂的逻辑处理,例如处理嵌套标签、过滤广告或脚本等。此外,对于一些复杂的网页,...
本项目提供了一个功能完善的Java视频截取和播放的源代码,让我们深入探讨这个主题。 首先,Java中的视频处理涉及到多个关键概念和技术: 1. **媒体框架**:Java Media Framework (JMF) 是Java中处理多媒体内容的...
该工具类用于java代码对图片的截取,按照上下左右边距的百分比截取,然后返回被截取之后图片信息的byte数组,用户可以将byte数组,用fileoutputStream保存在指定的目录
本文将深入探讨一个使用Java编程语言实现的屏幕截取软件,该软件模仿了QQ的截图功能,包括全局快捷键以及自定义截图区域的特性。 首先,Java作为一种跨平台的编程语言,具有丰富的库和API,使其成为开发此类应用的...
本项目标题“java视频剪辑,截取视频指定时间段内容”表明这是一个使用Java语言实现的视频剪辑工具,能够帮助用户按照指定的时间段从原始视频中截取出子视频。这种功能对于个人用户进行视频编辑、内容筛选或教学材料...
JSP则是一种动态网页技术,可以方便地结合HTML和Java代码来创建交互式网页。 2. **Java Media Framework (JMF)**: Java Media Framework是Java标准版(Java SE)的一部分,允许开发者处理多媒体数据,如音频和...
在开发Web应用时,用户头像的上传与编辑是一个常见的需求。...通过合理的架构设计和代码实现,可以为用户提供高效、便捷的头像编辑功能。在实际项目中,开发者需要关注性能、安全和用户体验,以实现高质量的Web应用。
Java作为一种广泛使用的编程语言,提供了多种方法来实现网页截取功能。本篇将详细介绍如何利用Java程序来实现网页截取,并探讨相关知识点。 首先,我们需要理解网页截取的基本原理。网页是由HTML、CSS和JavaScript...
Java 实现头像的截取,并上传头像。 项目使用说明: 1,要下载maven ,并配置环境变量 2,将image.jsp里面的图片换成你的本地图片 3,通过maven 打包。 4,部署到tomcat.打开image.jsp页面就可以验证了。 ...
JAVA源代码是程序的核心部分,它包含了实现特定功能的所有指令和逻辑。对于学习和研究JAVA编程的人来说,这样的源代码是非常宝贵的资源。通过阅读和分析源代码,我们可以了解软件的工作原理,学习到如何在JAVA中实现...
在Java编程环境中,截取视频画面是一项常见的任务,特别是在多媒体...虽然本教程主要针对Windows 7 64位系统,但FFmpeg本身是跨平台的,只要确保正确安装并在Java代码中提供相应的命令,就可以在其他操作系统上运行。
- **Robot类**:Java中的`java.awt.Robot`类是实现屏幕截取的关键。它提供了`createScreenCapture()`方法,可以获取指定矩形区域的屏幕图像。 - **Graphics2D**:截取的图像通常是一个BufferedImage对象,可以通过...