Java存储以统一编码将页面爬网到mysql

时间:2011-06-01 01:50:38

标签: java mysql encoding web-crawler

我正在使用Java将网页抓取到MySQL数据库。

这些网页采用各种编码方式(例如GBK,UTF8 ...),可能不包含任何ASCII字符,但是,我设法检测每个网页的编码并获取可读字符串(可读字符串表示它在{{{ 1}},如Eclipse console)。

我从Web Browser标记获得网页编码,如果找不到则默认为UTF-8。 请参阅以下代码段:

<meta>

然后,我将它存储到MySQL。 MySQL连接URL为InputStream is = hconn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b = -1; while (-1 != (b = is.read())) { baos.write((byte) b); } String charset = "UTF-8"; Document doc = Jsoup.parse(baos.toString()); Elements metas = doc.select("meta[http-equiv=Content-Type]"); Pattern p = Pattern.compile("charset=([0-9a-zA-Z_\\-]+)"); Matcher m; for (Element meta : metas) { m = p.matcher(meta.toString()); if (m.find()) charset = m.group(1); } String str = new String(baos.toByteArray(), charset); ,存储文本的列为jdbc:mysql://localhost:3306/db?characterEncoding=gbk编码。

事情发生了GBK中显示的字符串在MySQL中被证明是无法识别的序列,有时可能引发SQLException。在观察上,没有Eclipse console字符串会出错。

我认为将GBK字符串转换为Non-GBK会有效,但如何? 是否有任何解决方法?我的最终目标是构建倒排索引。

首选编码转换的答案。

任何帮助都将不胜感激。提前谢谢。

<小时/> 添加

创建表SQL:

GBK

错误讯息:

CREATE TABLE `indexer`.`pages` ( `content` TEXT CHARACTER SET gbk COLLATE gbk_chinese_ci, `url` VARCHAR(512) NOT NULL, `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE = InnoDB;

1 个答案:

答案 0 :(得分:0)

Java将在内部正确表示字符串,由Eclipse控制台显示。您应该能够使用UTF8连接到数据库并将数据存储在UTF8编码列中。如果您希望列为GBK,我仍然会使用UTF8进行连接。如果这不起作用,如果您可以发布CREATE TABLE语句和之前收到的错误消息,将会很有帮助。