`
stulance
  • 浏览: 31632 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【开源软件】htmlcleaner获取页面编码bug分析

阅读更多

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));
 

 

分享到:
评论

相关推荐

    Android分析Bugreport开源工具

    ChkBugReport是一个用于分析android的bugreport的开源工具,它可以把你得到的bugreprot导出成适合阅读的html。导出的html文件包含了根据bugreport数据得出的图表和分析结论,主要包括进程内存占用信息、程序ANR或...

    开源软件bug管理工具bugzilla-3.0.4.tar.gz

    Bugzilla是一款广受欢迎的开源软件缺陷跟踪系统,用于管理和跟踪软件开发中的错误、缺陷和问题。这个压缩包“bugzilla-3.0.4.tar.gz”包含的是Bugzilla的3.0.4版本,这是一个历史版本,但它依然代表了开源社区在bug...

    [信息办公]BugFree v2.0 RC1 Build 20071031 (开源Bug管理系统)_bugfree.zip

    总结,BugFree v2.0 RC1 Build 20071031是一个强大而灵活的开源Bug管理系统,它为软件开发团队提供了一个全面的解决方案,帮助他们更好地管理和优化软件开发过程。无论是小型团队还是大型企业,都能从其丰富的功能和...

    开源Bug管理系统

    开源Bug管理系统是软件开发过程中不可或缺的一部分,它帮助团队有效地跟踪、管理和修复软件中的错误或缺陷,也就是我们常说的“BUG”。这些系统通常提供一个平台,让开发者、测试人员以及项目管理者能够协同工作,...

    人人开源renrenadmin后台系统redis cluster session bug 修复

    renren.io 下 开源资源admin系统使用redis cluster 共享session时存在重复登录bug,此文件修复了该bug

    FreeSwitch media bug获取通话语音流的完整例子

    在FreeSwitch这个强大的开源通信平台中,Media Bug是一个非常重要的工具,它允许开发者获取和处理通话过程中的媒体流,例如语音、视频等。本案例将详细介绍如何利用Media Bug功能来获取通话语音流的完整流程。 首先...

    轻量化的开源Bug管理系统Cat2Bug-Platform的宗旨是快速简便跟踪处理缺陷

    轻量化的开源Bug管理系统,Cat2Bug-Platform的宗旨是快速简便跟踪处理缺陷,让所有开发者愉快的处理BUG问题,减少缺陷在软件工程管理中的成本。Cat2Bug-Platform是一套永久免费开源的Bug管理平台,将毫无保留给个人...

    bugfree2.0软件测试bug管理工具

    BugFree 2.0 是一款专为软件测试而设计的开源Bug管理工具,它提供了高效、易用且灵活的环境来跟踪和管理软件开发过程中的缺陷。这款工具旨在帮助开发团队更好地协调工作,确保产品质量,减少错误并提高整体开发效率...

    HtmlCleaner

    HtmlCleaner是一个开源的Java语言的Html文档解析器。 HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。默认它遵循的规则是类似于大部份web浏览器为创文档对象模型所使用的规则...

    借助开源项目,学习软件开发

    在IT行业中,软件开发是一项核心技能,而开源项目则是学习这项技能的重要途径。开源项目意味着源代码对公众开放,允许任何人查看、学习甚至修改。这种开放性为新手开发者提供了宝贵的资源,使他们能够深入理解软件...

    开源项目管理系统、bug管理系统

    Dream项目管理系统(bug管理系统)在基于Winner权限管理系统的基础上开发出的一个独立的web应用,该系统默认是设计成软件公司或电子科技公司开发模式,下载安装即可直接使用。其他行业,只需在后台的设置中稍作修改...

    HTMLcleaner

    HTMLcleaner是一个强大的Java开源解析框架,专门设计用于处理HTML文档,它可以帮助开发者高效地提取HTML文档中的特定元素。在Web开发中,我们经常会遇到不规范的HTML代码,这些代码可能由于各种原因(如手动编辑、...

    check bugreport自动分析bugreport工具

    自动分析bugreport的工具,github开源项目

    最新开源PLC编缉软件,可用vsstudio 直接编译

    标题中的“最新开源PLC编缉软件,可用vsstudio 直接编译”揭示了这个项目是一个基于Visual Studio(VS)开发环境的开源编程工具,用于编程逻辑控制器(PLC)。PLC是工业自动化系统中用于控制机械设备或生产过程的...

    freescada开源wpf组态软件

    FreeSCADA是一款基于WPF(Windows Presentation Foundation)技术的开源工业组态软件,它提供了全面的解决方案,使得用户能够快速构建自己的监控系统。这个软件包含了丰富的功能,如组态界面设计、内置脚本语言以及...

    java web 开源 物流软件

    【Java Web 开源物流软件详解】 Java Web 开源物流软件是一种基于B/S(Browser/Server,浏览器/服务器)架构的系统,它允许用户通过网页浏览器进行操作,无需安装客户端软件,降低了部署和维护的成本。此类软件的...

    BLM 开源图书管理软件

    "BLM 开源图书管理软件"是一款基于Python编程语言开发的高效、易用且功能丰富的图书管理系统。它的独特之处在于其能够从Amazon和豆瓣两大知名在线平台获取书籍的相关数据,为用户提供了极大的便利。 首先,Python是...

    Bug跟踪管理软件bugzilla

    Bugzilla是一款广泛使用的开源Bug跟踪管理系统,专为软件开发团队设计,以协助他们高效地管理和解决软件中的问题和缺陷。这个系统提供了强大的功能,确保软件的质量控制和开发流程的顺畅。 1. **Bug生命周期管理**...

    开源的bug管理系统.zip

    在Java编程语言中,有许多优秀的开源bug管理解决方案,它们为团队协作提供了高效的工作流程,确保软件质量。 首先,我们要了解Bug管理系统的常见功能。它们通常包括: 1. **问题报告**:用户可以通过简洁明了的...

Global site tag (gtag.js) - Google Analytics