错误:
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信息并且更改默认编码了。
大家有不同的看法欢迎留言讨论.转载请注明出处!谢谢啦。
分享到:
相关推荐
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....
我注意好多人都说没有org.htmlparser.Node和其他的一些.class文件,这里把下载后解压出来的5个jar包全部导入工程就可以引入所需的文件了
import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.tags.TableTag; import org.htmlparser.util...
Winista.Htmlparser.net 源代码 本资料共包含以下附件: HtmlParser c#源码+demo.rar
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....
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']...
c#版htmlparser htmlparser.dll htmlparser源代码
数据库:MySQL 平台:.net framework 2.0 (C#) 组建:Winista.Text.HtmlParser
基于java的开发源码-HTML文档解析器 HTMLParser.zip 基于java的开发源码-HTML文档解析器 HTMLParser.zip 基于java的开发源码-HTML文档解析器 HTMLParser.zip 基于java的开发源码-HTML文档解析器 HTMLParser.zip 基于...
Html解析助手htmlparser.jar。Html解析助手htmlparser.jar
class MyHTMLParser(HTMLParser.HTMLParser): def __init__(self): self.selected = ['html', 'body', 'table', 'head', 'meta', 'style', 'tr', 'td'] self.reset() self._level_stack = [] self.flag = True...
编译过的HtmlParser.dll文件,可直接使用
Winista.Htmlparser的源码,.Net版本,另加Demo。参考源自....
含Winista.HtmlParser和英文帮助文档,以及包含文档翻译功能html帮助文档
Winista.Htmlparser 源码 C#类库 帮助文档 Winista.Htmlparser 源码 C#类库 帮助文档
解析网页利器 而且是开源资源 大小192kb HTML杀手 分析器类库 完整的规范化类
解析html网页的框架,速度快,且小巧。如果只是解析html,解压文件中两个以html开头的jar包即可。
Winista HtmlParser Winista HtmlParser Winista HtmlParser Winista HtmlParser
Winista.Htmlparser是一个开源项目,压缩包里有源代码和相关的使用稳定,能够快速的从一个网站上取到文本数据
Unity & C# 解析HTML插件 很好用。