首页 > 代码库 > 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的值必须分别是periodicalsection和article,否则不行每个navpoint标签内必须要有content标签,否则使用kindlegen生成mobi文件时会报错。

JAVA抓取网页内容、生成kindle支持的mobi格式的文件时可能会遇到的问题及解决方案