2008/08/18

Hpricotでテキスト表示させると「 」が「?」になる

対処方法

require 'hpricot'
require 'hpricot/xchar'

Hpricot::XChar::PREDEFINED_U.merge!({" " => 32})←①
or
Hpricot::XChar::PREDEFINED_U.update({" " => 32})←②

doc = Hpricot('

before after

')
puts doc.inner_text

①または②を記載する。
「 」へのエンコード対応表がないので原因。
投稿を公開

JavaでのHTMLパース

protected void regist(String path) throws Exception {

try {

log.info("regist file:" + path);


String url = getURLFromPath(path);
if (StringUtils.isBlank(url)) {
log.warn("path format invalid:" + path);
return;
}

// URLコンテンツテーブル検索
Map req = new HashMap();
req.put("url", url);
List resList = urlContentSQL.select(req);

// 複数セーブポイント
// urlContentSQL.getSqlMapClient().startTransaction()

String uriFileName = path;
if (uriFileName.indexOf(':') == -1)
uriFileName = "file:" + uriFileName;

Source source = new Source(new InputStreamReader(new FileInputStream(uriFileName), "JISAutoDetect"));

String title = getTitle(source);
String txt = source.getTextExtractor().setIncludeAttributes(true).toString();
String fullTxt = txt;
String orgTxt = source.toString();

req.put("title", title);
req.put("fullTxt", fullTxt);
req.put("orgTxt", orgTxt);
// modified_datetime // デフォルトで設定される
req.put("modifiedUsrId", usrId);

String contentId = null;
// URLコンテンツテーブル新規作成
if (resList == null || resList.size() == 0) {

log.info("insert url_content");

// created_datetime デフォルトで設定される

contentId = MsgDBUtils.getUUID();
req.put("createdUsrId", usrId);
req.put("id", contentId);
urlContentSQL.insert(req);

}
// URLコンテンツテーブル更新
else {

log.info("update url_content");

contentId = (String)resList.get(0).get("id");
urlContentSQL.update(req);

}

// コンテンツタグ対応を検索
String seedUrlId = getSeedUrlIdFromPath(path);
List
resSeedUrlList = getSeedUrlIdData(seedUrlId);
if (resSeedUrlList == null || resSeedUrlList.size() == 0) {
log.error("seed_url.seed_url_id invalid:" + seedUrlId);
return;
// throw new Exception("seed_url.seed_url_id invalid:" + seedUrlId);
}

for (Map resSeedUrl : resSeedUrlList) {

Map reqContentTagMap = new HashMap();
List
resContentTagMapList = contentTagMapSQL.select(reqContentTagMap);

// コンテンツタグ対応新規作成
if (resContentTagMapList == null || resContentTagMapList.size() == 0) {

log.info("insert content_tag_map");

reqContentTagMap.put("id", MsgDBUtils.getUUID());
contentTagMapSQL.insert(reqContentTagMap);

}

}

}
catch (Exception e) {
log.error("regist error", e);
throw e;

}


}

JavaでのHTMLパース

protected void regist(String path) throws Exception {

try {

log.info("regist file:" + path);


String url = getURLFromPath(path);
if (StringUtils.isBlank(url)) {
log.warn("path format invalid:" + path);
return;
}

// URLコンテンツテーブル検索
Map req = new HashMap();
req.put("url", url);
List resList = urlContentSQL.select(req);

// 複数セーブポイント
// urlContentSQL.getSqlMapClient().startTransaction()

String uriFileName = path;
if (uriFileName.indexOf(':') == -1)
uriFileName = "file:" + uriFileName;

Source source = new Source(new InputStreamReader(new FileInputStream(uriFileName), "JISAutoDetect"));

String title = getTitle(source);
String txt = source.getTextExtractor().setIncludeAttributes(true).toString();
String fullTxt = txt;
String orgTxt = source.toString();

req.put("title", title);
req.put("fullTxt", fullTxt);
req.put("orgTxt", orgTxt);
// modified_datetime // デフォルトで設定される
req.put("modifiedUsrId", usrId);

String contentId = null;
// URLコンテンツテーブル新規作成
if (resList == null || resList.size() == 0) {

log.info("insert url_content");

// created_datetime デフォルトで設定される

contentId = MsgDBUtils.getUUID();
req.put("createdUsrId", usrId);
req.put("id", contentId);
urlContentSQL.insert(req);

}
// URLコンテンツテーブル更新
else {

log.info("update url_content");

contentId = (String)resList.get(0).get("id");
urlContentSQL.update(req);

}

// コンテンツタグ対応を検索
String seedUrlId = getSeedUrlIdFromPath(path);
List
resSeedUrlList = getSeedUrlIdData(seedUrlId);
if (resSeedUrlList == null || resSeedUrlList.size() == 0) {
log.error("seed_url.seed_url_id invalid:" + seedUrlId);
return;
// throw new Exception("seed_url.seed_url_id invalid:" + seedUrlId);
}

for (Map resSeedUrl : resSeedUrlList) {

Map reqContentTagMap = new HashMap();
List
resContentTagMapList = contentTagMapSQL.select(reqContentTagMap);

// コンテンツタグ対応新規作成
if (resContentTagMapList == null || resContentTagMapList.size() == 0) {

log.info("insert content_tag_map");

reqContentTagMap.put("id", MsgDBUtils.getUUID());
contentTagMapSQL.insert(reqContentTagMap);

}

}

}
catch (Exception e) {
log.error("regist error", e);
throw e;

}


}

2008/08/14

rubyのコード推測精度が低いことへの対処

NKFのコード推測メソッドを利用する。
str.kconv(Kconv::UTF8, NKF.guess(str))
str.toutf8だとうまくいかないことが多い。

rubyのエンコードde

2008/08/13

JRUBYでCAYENNEをつかう

registerNewObjectの部分でうまく動作しない。
ひとひねり必要そうだ。

JRUBY