简单也许更好——关于HTMLCleaner保存的问题

做一个类似爬虫的小品,要从网页上爬下数据来,处理后,保存。

试用了HTMLParser、NekoHtml、JTidy发现效果都不好,尤其是网页书写不规范的时候。

最后,选定了HTMLCleaner。几乎可以搞定所有网页。

用起来也很简单,网上大部分中文介绍都会有类似这样的代码示例:

TagNode root = cleaner.clean(text or url);

 然后用这样的代码保存:

CleanerProperties properties = cleaner.getProperties();
PrettyXmlSerializer prettyXmlSerializer = new PrettyXmlSerializer(properties);
prettyXmlSerializer.write(root, Writer, encoding);

不过,在测试的时候,爬126.com的首页。爬下来的页面,在浏览器里打开的时候,背景图打不开。

查看保存的文件发现,页面上的js,有些被在奇怪的地方换行了:

$id('styleConf').innerHTML = $id('styleconf' + n).innerHTML + '
			<b class="ico ico-arr ico-arr-d">
			</b>';

 比如上面这样……

显然这种换行方法,会导致浏览器引起js错误(把String分成多行而没有续行符)。

分析后,觉得应该是HTMLClenter为了代码的美观,试图让每个Tag另起一行(遇到"<" 或者"<"、“>”对就换行,没仔细研究)

于是上官网看了下介绍:

http://htmlcleaner.sourceforge.net/parameters.php

 并没有发现哪个设置是让Tag不换行的……

接着又仔细一想,应该不是Parser时候的问题——如果是的话,说明HTMLCleaner错把JS里面的内容解析为Tag了。不过显然没有(倒是HTMLParser有这样的迹象)

进一步输出查看,也印证了这样的假设——输出script标签的时候发现,类似刚才那种地方并没有换行。

也就是说,这种修改是在保存的时候发生的。

这才注意到,那个大多数介绍页面上,用来保存页面的类,叫做PrettyXmlSerialize ……- -!

查了API后,发现这么一段话:

http://htmlcleaner.sourceforge.net/doc/index.html 写道
Pretty XML serializer - creates resulting XML with indenting lines.

 凶手就是它没错了,就是它做了半吊子的事情:不是按照HTMLCleaner分析出来的Tag来决定哪应该换行,而自己擅自分析页面,乱换行……

找到原因就好办,又看了看API,发现另外两个类:SimpleXmlSerializer和SimpleHtmlSerializer

都是“without indenting lines”的……实际测试之后,发现效果差不多。

于是,问题解决。

想说:

如果怀着半吊子的心态的话……果然,多一事不如少一事……

如果恰巧有人用HTMLCleaner,又恰巧需要保存页面的话……

如果页面内容比较简单也就算了。如果想对复杂的话……

最好还是选择相对简单的保存方法——简单的,也许更好……

猜你喜欢

转载自turnip-gray.iteye.com/blog/1867611