首页 > 代码库 > JAVA抓取网页内容、生成kindle支持的mobi格式的文件时可能会遇到的问题及解决方案
JAVA抓取网页内容、生成kindle支持的mobi格式的文件时可能会遇到的问题及解决方案
问题1:内容抓取Batch在解析rss时,有的网站的rss中明明有发布时间,但获取的发布时间始终为null。
原 因:那些网站的rss的发布时间格式不符合Rome.jar的要求,无法解析,所以返回null。
解决方案:修改Rome.jar的源码,在com/sun/syndication/rome.properties中增加
datetime.extra.masks属性,用于适应多种发布日期的格式。
如: datetime.extra.masks=yyyy-MM-dd HH:mm:ss|yyyy-MM-dd HH:mm|EEE, dd MMM yy HH:mm:ss|yyyy-MM-dd HH:mm:ss.SSS
修改源码后重新打jar包,引用到JAVA工程中,就可以解析不同格式的发布时间了。
-------------------------------------------------------------------------------------------
问题2:抓取某些网页时,会提示编码错误,如:
org.htmlparser.util.EncodingChangeException:character mismatch (new: [0xfeff] != old: [0x9518锘]) for encoding change from ISO-8859-1 to gbk at character offset 214
原 因:如果请求url返回的页面上中文的title写在了meta的前面,而且这个meta里设置的charset编码信息(gbk)又和parser默认的编码(ISO-8859-1)不一样,那么就会报这个错。
但是如果meta之前没有任何中文,那么就不会报这个错。因为htmlparser本身会根据html源码中的charset信息设置编码。
解决方案:捕捉到这个异常后,使用meta里设置的charset编码重新抓取一遍。
-------------------------------------------------------------------------------------------
问题3:epub生成Batch在Linux环境下使用kindlegen工具把epub文件转换成mobi文件时,没有出现任何异常,但也没有生成mobi文件。
原因:不明
解决方案:
Process process = Runtime.getRuntime().exec(kindlegen命令);InputStream is = process.getInputStream();int r;while(-1 != (r = is.read())) { System.out.print((char)r);}
把InputStream的值打印出来之后就可以生成mobi文件了。
-------------------------------------------------------------------------------------------
问题4:抓取的网页内容中有时含有被抓取的网站自己的JS函数、视频链接等代码,从而显示在浏览器上时可能会提示JS错误
解决方案:过滤掉所有的script、style、link等标签,以及所有标签的事件(如:onclick、onmouseover等)
-------------------------------------------------------------------------------------------
问题5:生成的mobi文件在kindle paperwhite设备上不能被识别为电子书
原因:1、缺少内容源目录文件以及在opf文件的guide节点中对目录文件的定义,所以Kindle设备无法显示其目录。
2、kindle paperwhite会把报刊、杂志类型的mobi文件自动转换成pobi文件,其他类型的mobi文件不会转换。
解决方案:1、增加内容源目录文件和opf文件中对目录的引用
2、要让kindle paperwhite识别报刊、杂志类型的mobi文件,必须有以下几处设置:
1、在opf文件的metadata里增加如下代码:
<x-metadata> <output encoding="utf-8" content-type="application/x-mobipocket-subscription-magazine"></output></x-metadata>
2、在ncx里按照要求把navpoint 写成
<navpoint class="periodical"> <navpoint class="section"> <navPoint class="article" >......
这几个class一定要写,而且class的值必须分别是periodical、section和article,否则不行。 每个navpoint标签内必须要有content标签,否则使用kindlegen生成mobi文件时会报错。
JAVA抓取网页内容、生成kindle支持的mobi格式的文件时可能会遇到的问题及解决方案