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));
分享到:
相关推荐
开源心电图分析软件是EP Limited推出的一款专用于心电图(ECG)数据处理与分析的工具。这款软件的核心特点在于其开放源代码的特性,允许用户进行自定义开发和二次利用,促进了医学研究与临床实践的结合。在提供的...
第三部分着重讲解在开源软件选型中非常重要的环节——开源软件许可,通过问答的方式向大家讲解开源许可相关的知识产权问题对开源软件选型的影响,并对开源许可中最重要的GPL协议进行了分析;第四部分向大家推荐一...
关于开源软件授权协议对于知识产权理论和实践的一些思考
Bugzilla是一款广受欢迎的开源软件缺陷跟踪系统,用于管理和跟踪软件开发中的错误、缺陷和问题。这个压缩包“bugzilla-3.0.4.tar.gz”包含的是Bugzilla的3.0.4版本,这是一个历史版本,但它依然代表了开源社区在bug...
总结,BugFree v2.0 RC1 Build 20071031是一个强大而灵活的开源Bug管理系统,它为软件开发团队提供了一个全面的解决方案,帮助他们更好地管理和优化软件开发过程。无论是小型团队还是大型企业,都能从其丰富的功能和...
renren.io 下 开源资源admin系统使用redis cluster 共享session时存在重复登录bug,此文件修复了该bug
Java开源的Bug管理系统是一款基于Java技术构建的问题跟踪与解决...通过深入学习和实践这样的开源Bug管理系统,开发者不仅可以掌握Java编程技术,还能理解软件工程中的质量管理与协同工作原理,提升自身的项目管理能力。
开源Bug管理系统是软件开发过程中不可或缺的一部分,它帮助团队有效地跟踪、管理和修复软件中的错误或缺陷,也就是我们常说的“BUG”。这些系统通常提供一个平台,让开发者、测试人员以及项目管理者能够协同工作,...
在FreeSwitch这个强大的开源通信平台中,Media Bug是一个非常重要的工具,它允许开发者获取和处理通话过程中的媒体流,例如语音、视频等。本案例将详细介绍如何利用Media Bug功能来获取通话语音流的完整流程。 首先...
DotSpatial是一个专门为地理信息系统(GIS)领域设计的开源软件,它的特点和应用范围相当广泛,同时它的源代码完全开放,这意味着用户可以自由地下载、查看以及修改软件的源代码。对于GIS开发者来说,这不仅提供了一...
轻量化的开源Bug管理系统,Cat2Bug-Platform的宗旨是快速简便跟踪处理缺陷,让所有开发者愉快的处理BUG问题,减少缺陷在软件工程管理中的成本。Cat2Bug-Platform是一套永久免费开源的Bug管理平台,将毫无保留给个人...
HtmlCleaner是一个开源的Java语言的Html文档解析器。 HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。默认它遵循的规则是类似于大部份web浏览器为创文档对象模型所使用的规则...
在IT行业中,软件开发是一项核心技能,而开源项目则是学习这项技能的重要途径。开源项目意味着源代码对公众开放,允许任何人查看、学习甚至修改。这种开放性为新手开发者提供了宝贵的资源,使他们能够深入理解软件...
1. **数据抓取**:HtmlCleaner 可用于网页爬虫项目,提取页面上的特定数据,如价格、评论等。 2. **HTML 清理**:它可以清理不规范的 HTML,使其符合标准,便于进一步处理或存储。 3. **模板引擎**:结合其他技术...
GIS(Geographic Information System,地理信息系统)是一种集成了计算机硬件、软件和地理数据的系统,用于获取、存储、管理、分析和展示所有类型地理信息。开源GIS是指那些提供源代码,允许用户自由查看、修改和...
开源项目-driusan-bug.zip是一个使用Go语言编写的简单且分布式的错误跟踪系统,旨在为开发者提供一个高效且易用的工具来管理和追踪代码中的bug。该项目的核心目标是简化bug报告、分配以及修复的过程,使得协作开发变...
自动分析bugreport的工具,github开源项目
- `licence.txt`:包含了HTMLCleaner的授权协议信息,通常为开源许可证,例如Apache License 2.0。 - `default.xml`:预设的清理规则文件,定义了HTMLCleaner如何处理HTML文档。 - `build.xml`:Ant构建脚本,用于...
FreeSCADA是一款基于WPF(Windows Presentation Foundation)技术的开源工业组态软件,它提供了全面的解决方案,使得用户能够快速构建自己的监控系统。这个软件包含了丰富的功能,如组态界面设计、内置脚本语言以及...
《2023年中国软件供应链安全分析报告》深入探讨了国内企业软件开发中面临的供应链安全问题,重点关注了自主开发源代码、开源软件生态及其安全状况,以及典型软件供应链安全风险实例。报告指出,软件供应链安全攻击...