HtmlCleaner是一个开源的Java语言的Html文档解析器。相当强大且简单易用。这里不介绍它的使用,具体使用可以到它的官网去看(http://htmlcleaner.sourceforge.net/javause.php)
这里说一个HtmlCleaner的bug.
问题现象:
在用htmlCleaner抓取网页内容时,如果不知道网页的编码,可以不设置编码。代码如下:
HtmlCleaner cleaner = new HtmlCleaner();
URL url = new URL("http://www.qq.com/");
TagNode node = cleaner.clean(url);
这样htmlCleaner会自动获取页面编码,但htmlCleaner在获取页面编码时,有一种情况没有考虑到。当页面的编码是以下面形式给出时
<meta charset="UTF-8" />
这时,htmlcleaner将无法获取页面编码,而使用系统编码。如果系统编码和网页编码不一致就会出现乱码。
解决方法:
public static String getCharset(URL url) throws Exception {
URLConnection urlConnection = url.openConnection();
String charset = null;
if (charset == null) {
charset = getCharsetFromContentTypeString( urlConnection.getHeaderField("Content-Type") );
}
if (charset == null) {
charset = getCharsetFromContent(url);
}
if (charset == null) {
charset = getCharsetFromMeta(url);
}
if (charset == null) {
charset = HtmlCleaner.DEFAULT_CHARSET;
}
return charset;
}
public static String getCharsetFromContentTypeString(String contentType) {
if (contentType != null) {
String pattern = "charset=([a-z\\d\\-]*)";
Matcher matcher = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE).matcher(contentType);
if (matcher.find()) {
String charset = matcher.group(1);
if (Charset.isSupported(charset)) {
return charset;
}
}
}
return null;
}
public static String getCharsetFromContent(URL url) throws IOException {
InputStream stream = url.openStream();
byte chunk[] = new byte[2048];
int bytesRead = stream.read(chunk);
if (bytesRead > 0) {
String startContent = new String(chunk);
String pattern = "\\<meta\\s*http-equiv=[\\\"\\']content-type[\\\"\\']\\s*content\\s*=\\s*[\"']text/html\\s*;\\s*charset=([a-z\\d\\-]*)[\\\"\\'\\>]";
Matcher matcher = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE).matcher(startContent);
if (matcher.find()) {
String charset = matcher.group(1);
if (Charset.isSupported(charset)) {
return charset;
}
}
}
return null;
}
public static String getCharsetFromMeta(URL url) throws Exception {
InputStream stream = url.openStream();
byte chunk[] = new byte[2048];
int bytesRead = stream.read(chunk);
if (bytesRead > 0) {
String startContent = new String(chunk);
String pattern = "\\<meta\\s*[\\\"\\']charset=([a-z\\d\\-]*)[\\\"\\'\\>]";
Matcher matcher = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE).matcher(startContent);
if (matcher.find()) {
String charset = matcher.group(1);
if (Charset.isSupported(charset)) {
return charset;
}
}
}
return null;
}
注:getCharsetFromContentTypeString和 getCharsetFromContent方法是htmlCleaner包中提供的方法
使用getCharset方法获取编码,在初始化htmlCleaner时,设置网页编码:
HtmlCleaner cleaner = new HtmlCleaner();
URL url = new URL("http://www.qq.com/");
TagNode node = cleaner.clean(url,getCharset(url));
分享到:
相关推荐
ChkBugReport是一个用于分析android的bugreport的开源工具,它可以把你得到的bugreprot导出成适合阅读的html。导出的html文件包含了根据bugreport数据得出的图表和分析结论,主要包括进程内存占用信息、程序ANR或...
Bugzilla是一款广受欢迎的开源软件缺陷跟踪系统,用于管理和跟踪软件开发中的错误、缺陷和问题。这个压缩包“bugzilla-3.0.4.tar.gz”包含的是Bugzilla的3.0.4版本,这是一个历史版本,但它依然代表了开源社区在bug...
总结,BugFree v2.0 RC1 Build 20071031是一个强大而灵活的开源Bug管理系统,它为软件开发团队提供了一个全面的解决方案,帮助他们更好地管理和优化软件开发过程。无论是小型团队还是大型企业,都能从其丰富的功能和...
开源Bug管理系统是软件开发过程中不可或缺的一部分,它帮助团队有效地跟踪、管理和修复软件中的错误或缺陷,也就是我们常说的“BUG”。这些系统通常提供一个平台,让开发者、测试人员以及项目管理者能够协同工作,...
renren.io 下 开源资源admin系统使用redis cluster 共享session时存在重复登录bug,此文件修复了该bug
在FreeSwitch这个强大的开源通信平台中,Media Bug是一个非常重要的工具,它允许开发者获取和处理通话过程中的媒体流,例如语音、视频等。本案例将详细介绍如何利用Media Bug功能来获取通话语音流的完整流程。 首先...
轻量化的开源Bug管理系统,Cat2Bug-Platform的宗旨是快速简便跟踪处理缺陷,让所有开发者愉快的处理BUG问题,减少缺陷在软件工程管理中的成本。Cat2Bug-Platform是一套永久免费开源的Bug管理平台,将毫无保留给个人...
BugFree 2.0 是一款专为软件测试而设计的开源Bug管理工具,它提供了高效、易用且灵活的环境来跟踪和管理软件开发过程中的缺陷。这款工具旨在帮助开发团队更好地协调工作,确保产品质量,减少错误并提高整体开发效率...
HtmlCleaner是一个开源的Java语言的Html文档解析器。 HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。默认它遵循的规则是类似于大部份web浏览器为创文档对象模型所使用的规则...
在IT行业中,软件开发是一项核心技能,而开源项目则是学习这项技能的重要途径。开源项目意味着源代码对公众开放,允许任何人查看、学习甚至修改。这种开放性为新手开发者提供了宝贵的资源,使他们能够深入理解软件...
Dream项目管理系统(bug管理系统)在基于Winner权限管理系统的基础上开发出的一个独立的web应用,该系统默认是设计成软件公司或电子科技公司开发模式,下载安装即可直接使用。其他行业,只需在后台的设置中稍作修改...
HTMLcleaner是一个强大的Java开源解析框架,专门设计用于处理HTML文档,它可以帮助开发者高效地提取HTML文档中的特定元素。在Web开发中,我们经常会遇到不规范的HTML代码,这些代码可能由于各种原因(如手动编辑、...
自动分析bugreport的工具,github开源项目
标题中的“最新开源PLC编缉软件,可用vsstudio 直接编译”揭示了这个项目是一个基于Visual Studio(VS)开发环境的开源编程工具,用于编程逻辑控制器(PLC)。PLC是工业自动化系统中用于控制机械设备或生产过程的...
FreeSCADA是一款基于WPF(Windows Presentation Foundation)技术的开源工业组态软件,它提供了全面的解决方案,使得用户能够快速构建自己的监控系统。这个软件包含了丰富的功能,如组态界面设计、内置脚本语言以及...
【Java Web 开源物流软件详解】 Java Web 开源物流软件是一种基于B/S(Browser/Server,浏览器/服务器)架构的系统,它允许用户通过网页浏览器进行操作,无需安装客户端软件,降低了部署和维护的成本。此类软件的...
"BLM 开源图书管理软件"是一款基于Python编程语言开发的高效、易用且功能丰富的图书管理系统。它的独特之处在于其能够从Amazon和豆瓣两大知名在线平台获取书籍的相关数据,为用户提供了极大的便利。 首先,Python是...
Bugzilla是一款广泛使用的开源Bug跟踪管理系统,专为软件开发团队设计,以协助他们高效地管理和解决软件中的问题和缺陷。这个系统提供了强大的功能,确保软件的质量控制和开发流程的顺畅。 1. **Bug生命周期管理**...
在Java编程语言中,有许多优秀的开源bug管理解决方案,它们为团队协作提供了高效的工作流程,确保软件质量。 首先,我们要了解Bug管理系统的常见功能。它们通常包括: 1. **问题报告**:用户可以通过简洁明了的...