`
包子_feiFEI
  • 浏览: 73377 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类

HtmlParser 错误解决 character mismatch (new: [] != old: []) for encoding change from ...

 
阅读更多

错误:

character mismatch (new: 军 [0x519b] != old: [0xbe¾]) for encoding change from ISO-8859-1 to GB2312 at character offset 186。

原因:

如果请求url返回的页面上中文的title写在了meta的前面,而且这个meta里设置的charset编码信息又和parser默认的或者使用者自己设置定编码不一样。

那么就会报这个错,但是如果meta之前没有任何中文,那么就不会报这个错。因为htmlparser本身会根据html源码中的charset信息设置编码:<原创网址:http://hi.csdn.net/space-8079523.html,作者:蛰伏神兽>

让我们就根据报出的错误栈来看下htmlparser源码,来看看到底是怎么回事:

先来看下parser解析Node的流程,

parser会用IteratorImpl的nextNode()对指定的html源码一行一行的往下解析然后一个一个产生node,没产生一个Node就会用这个Node的扫描器扫描这个Node来构建子节点,或者执行一些操作。当遇到meta标签的时候他就会产生一个MetaTag标签,并且用对应Scanner(TagScanner)扫描这个标签:

这个方法中科院看到实际上这个方法就是执行了一下MetaTag的doSemanticAction();方法:

很明显这个方法的作用就是获取刚刚产生的MetaTag节点中的Content信息,编码信息,然后设置当前页面的编码。

也就是说htmlparser其实有自动搜索页面源码的编码的能力,<原创网址:http://hi.csdn.net/space-8079523.html,作者:蛰伏神兽
>在遍历整个html源码信息,一个一个产生Node的时候就开始设置了。

但是这必须要执行到拥有编码信息的Meta行才会发现这个页面的编码。那么也就是说之前用来解析的默认编码集很有可能和这个html页面编码是不一致的。

我们再来看看出错源的那段代码:

之前MetaTag的doSematicAction();中的setEcoding(charset)最终执行的代码就是这一部分。<原创网址:http://hi.csdn.net/space-8079523.html,作者:蛰伏神兽
>
也就是说如果默认的编码集和从后面meta信息中扫描的编码集不同的话,那么就会执行绿色的这一段代码。它会将Source,reset掉,然后用新的编码集来转换之前用默认编码集转换的那部分字符串。但是很明显,如果两次编码集不一样,转换出来的英文字符串一样,中文字符串却往往会不一样。也就是说,当我解析到meta信息的时候如果meta之前没有中文信息(有些网站会把title标签写在meta信息之前比如说铁血网首页www.tiexue.net)那么不管编码是否一致都不会报错,因为报错的那部分代码是的这一段

先后两种编码集转换的字符串要不一致才会报错,如果meta信息之前全是英文那肯定一致,也就不会报错了。


说到这里应该会有人和我一样有个疑问了:htmlparser的作者们为什么要设置这个错误类型呢?<原创网址:http://hi.csdn.net/space-8079523.html,作者:蛰伏神兽
>两种不同编码集转换的源代码,如果是中文的话肯定会不一致!

感觉这个错误类型完全没什么用啊。所以我解决这个错误的方法就是修改这部分源码,把这一段给注释掉~(就让他不一样吧,肯定不一样的啦。因为编码不同啦,所以不要报错啦):修改后代码:

好了.这样就行了,不管meta在title之前还是title之后都没关系了。htmlparser都会自动获取charset信息并且更改默认编码了。

大家有不同的看法欢迎留言讨论.转载请注明出处!谢谢啦。




分享到:
评论

相关推荐

    htmlparser

    META-INF/maven/org.htmlparser/htmlparser/pom.properties META-INF/maven/org.htmlparser/htmlparser/pom.xml org.htmlparser.Parser.class org.htmlparser.PrototypicalNodeFactory.class org.htmlparser.beans....

    htmlparser.jar文件

    在描述中提到的“org.htmlparser.Node”和其他的.class文件,这些都是HTMLParser库的核心组成部分。`org.htmlparser.Node` 是HTMLParser中的一个关键接口,它代表HTML文档中的一个节点,可以是元素(Element)、注释...

    Winista.HtmlParser(含帮助手册)

    Winista.HtmlParser可能采用了基于DOM(文档对象模型)或SAX(简单API for XML)的解析策略。DOM解析会构建一个完整的HTML结构树,而SAX则是事件驱动的,逐行解析,适用于大文件。 2. **API接口**: Winista....

    Winista.Htmlparser.Net 源码 +Demo

    压缩包中的`AnalyzeHtml.sln`是解决方案文件,包含了项目的配置信息。`HtmlParser2003`可能是一个早期版本的源代码,而`AnalyzeHtml`和`WebParser`则可能是演示如何使用HtmlParser的项目。 1. **AnalyzeHtml**:这...

    HTML Parser

    org.htmlparser.Tag org.htmlparser.Node org.htmlparser.Text org.htmlparser.Parser org.htmlparser.Remark org.htmlparser.tags.Div org.htmlparser.Attribute org.htmlparser.tags.Html org.htmlparser.tags....

    Winista.Htmlparser.Net 解析Html 的.net类库

    HtmlParser.Net是来源于Java的一个用来解析html的组件,主要用于改造或提取html。它能够高速解析html,是非常好的一个html解析和分析... 这个是.Net版本包括源代码和帮助文档。 版本:HTMLParser.Net - Community 1.8

    Winista.HTMLParser源码

    《Winista.HTMLParser源码解析与应用》 Winista.HTMLParser是一个用于网页爬虫开发的开源库,其源代码提供了一种高效的方式,帮助开发者解析HTML文档并从中提取所需信息。该库专为Visual Studio 2008设计,使得在...

    Html解析助手htmlparser.jar

    `htmlparser.jar`的主要功能包括: 1. **HTML解析**:它可以将HTML源代码转换成一个解析树,这个树状结构代表了HTML文档的各个元素和它们之间的关系。 2. **节点操作**:一旦解析完成,开发者可以遍历这个解析树,对...

    Winista.HTMLParser.dll

    《Winista.HTMLParser.dll:网页解析的开源利器》 在信息技术高速发展的今天,网页数据的抓取和分析已经成为一项至关重要的任务。对于开发者而言,能够高效地解析HTML文档,从中提取所需信息,无疑是一个强大的工具...

    Winista.Htmlparser.rar

    Htmlparser.chm文件很可能是一个帮助文档,包含了关于Winista.Htmlparser库的详细说明、API参考、示例代码和使用指南。通常,CHM(Compiled Help Manual)文件是微软编译的帮助文件格式,用户可以通过它来查找库的...

    beautifulsoup4-4.3.0

    class MutilHTMLParser(HTMLParser): def __init__(self, env, tags, select_name): self.env = env self.log = env.log self.taglevels=[] self.handledtags=tags #['select'] #['body'] #['title','body']...

    Winista.HtmlParser

    本文将深入探讨Winista.HtmlParser的功能特性、核心概念以及实际应用。 一、Winista.HtmlParser概述 Winista.HtmlParser作为一个强大的.NET HTML解析器,旨在简化HTML文档处理,提高开发效率。它提供了直观的API,...

    htmlParser.jar包

    无论是简单的网页抓取还是复杂的网页分析任务,HTMLParser都能够提供稳定且高效的解决方案。在实际开发中,只需正确引入jar包,并结合适当的编程技巧,就能充分利用这个框架的功能,实现各种HTML解析需求。

    Winista.HtmlParser.zip

    在使用Winista.HtmlParser时,首先需要导入插件并实例化解析器。之后,通过调用解析方法,将HTML文本转换为树形结构的节点集合。这些节点代表了HTML文档的各个部分,包括元素节点、文本节点和注释节点等。开发者可以...

    DI.HtmlParser .v2.20

    4. **错误处理**:HTML通常包含语法错误或非标准标签,DI.HtmlParser 具有良好的容错性,能处理不规范的HTML,尽可能正确地构建DOM树。 5. **源码可用**:作为一个开源项目,DI.HtmlParser 的源代码可供查看和修改...

    Winista.Htmlparser的源码,另加Demo。源自....

    通过分析Demo,我们可以了解Winista.Htmlparser的API设计和用法。 在使用Winista.Htmlparser时,开发者需要注意以下几点: 1. **初始化解析器**:创建解析器实例,可能需要传入HTML字符串或文件路径。 2. **解析...

    htmlparser.jar.zip

    在Web开发、数据抓取或网络分析领域,HTMLParser扮演着至关重要的角色。它可以帮助开发者轻松地处理复杂的HTML源代码,实现简易爬虫或者进行网页分析。 在实现简易爬虫时,HTMLParser提供了对HTML文档的解析能力,...

    用C#实现HtmlParser的代码

    用C#实现HtmlParser的代码 该篇文章主要介绍了用C#实现HtmlParser的两种方法,分别是使用System.Net.WebClient下载网页并使用正则表达式来分析Html内容,以及使用Winista.Htmlparser.Net解析Html。下面我们将详细...

    基于java的开发源码-HTML文档解析器 HTMLParser.zip

    基于java的开发源码-HTML文档解析器 HTMLParser.zip 基于java的开发源码-HTML文档解析器 HTMLParser.zip 基于java的开发源码-HTML文档解析器 HTMLParser.zip 基于java的开发源码-HTML文档解析器 HTMLParser.zip 基于...

    Winista.Text.HtmlParser采集南京价格信息网

    《使用Winista.Text.HtmlParser采集南京价格信息网的实践与技术解析》 在信息技术日新月异的今天,数据采集已成为各行各业不可或缺的一部分。本项目“Winista.Text.HtmlParser采集南京价格信息网”就是一个典型的...

Global site tag (gtag.js) - Google Analytics