这些页面来自Yahoo! Japan Finance和我的Perl代码,看起来像这样.
use strict; use HTML::Tree; use LWP::Simple; #use Encode; use utf8; binmode STDOUT,":utf8"; my @arr_links = (); $arr_links[1] = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203"; $arr_links[2] = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7201"; foreach my $link (@arr_links){ $link =~ s/"//gi; print("$link\n"); my $content = get($link); my $tree = HTML::Tree->new(); $tree->parse($content); my $bar = $tree->as_text; open OUTFILE,">>:utf8",join("","c:/",substr($link,-4),"_perl.txt") || die; print OUTFILE $bar; }
这个Perl脚本生成一个CSV文件,看起来像下面的截图,使用适当的汉字和假名,可以离线挖掘和操作:
我的R代码,如下所示. R脚本不是刚刚给出的Perl解决方案的完全重复,因为它不会删除HTML并留下文本(this answer建议使用R的方法,但在这种情况下不适用于我),而且没有循环等等,但意图是一样的.
require(RCurl) require(XML) links <- list() links[1] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203" links[2] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7201" txt <- getURL(links,.encoding = "UTF-8") Encoding(txt) <- "bytes" write.table(txt,"c:/geturl_r.txt",quote = FALSE,row.names = FALSE,sep = "\t",fileEncoding = "UTF-8")
我假设有一些HTML,文本和文件编码的组合,将允许我在R中生成类似于Perl解决方案的结果,但是我找不到它.我正在尝试删除的HTML页面的标题表示图表是utf-8,我已经将getURL调用中的编码和write.table函数中的编码设置为utf-8,但这一点还不够.
问题
如何使用R并且将文本作为CSV格式保存在“格式正确”的日文文本中,而不是看起来像线条噪音?
编辑:我添加了一个屏幕截图,以显示当我省略编码步骤时会发生什么.我得到什么看起来像Unicode代码,但不是字符的图形表示.它可能是某种与区域相关的问题,但是在完全相同的语言环境中,Perl脚本确实提供了有用的输出.所以这还是令人费解的.
我的会话信息:
R版本2.15.0补丁(2012-05-24 r59442)
平台:i386-pc-mingw32 / i386(32位)
区域:
1 LC_COLLATE = English_United Kingdom.1252
2 LC_CTYPE = English_United Kingdom.1252
3 LC_MONETARY = English_United Kingdom.1252
4 LC_NUMERIC = C
5 LC_TIME = English_United Kingdom.1252
附带基础包:
1统计图形grDevices utils数据集方法基础
解决方法
之前@kohske评论说,一旦Encoding()调用被删除,该代码为他工作.这让我想到他可能有一个日本的地区,这反过来表明我的机器上有一个区域性问题,以某种方式影响R,即使Perl避免了这个问题.我重新校准了我的搜索,发现this question采购了一个UTF-8文件,其中原始的海报遇到了类似的问题.答案涉及切换语言环境.我试了一下,发现将我的区域设置切换到日文似乎解决了这个问题,屏幕截图显示:
更新的R代码如下.
require(RCurl) require(XML) links <- list() links[1] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203" links[2] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7201" print(Sys.getlocale(category = "LC_CTYPE")) original_ctype <- Sys.getlocale(category = "LC_CTYPE") Sys.setlocale("LC_CTYPE","japanese") txt <- getURL(links,.encoding = "UTF-8") write.table(txt,fileEncoding = "UTF-8") Sys.setlocale("LC_CTYPE",original_ctype)
所以我们必须以编程方式与区域设置混乱.坦白说,我有点尴尬,我们显然在2012年在Windows上需要这样一个kludge.如上所述,在同一版本的Windows和同一个地方的Perl可以绕过这个问题,而不需要我更改我的系统设置.
上面更新的R代码的输出当然是HTML.对于有兴趣的人来说,以下代码在剥离HTML并保存原始文本方面取得了相当的成功,尽管结果需要很多的整理.
require(RCurl) require(XML) links <- list() links[1] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203" links[2] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7201" print(Sys.getlocale(category = "LC_CTYPE")) original_ctype <- Sys.getlocale(category = "LC_CTYPE") Sys.setlocale("LC_CTYPE",.encoding = "UTF-8") myhtml <- htmlTreeParse(txt,useInternal = TRUE) cleantxt <- xpathApply(myhtml,"//body//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)]",xmlValue) write.table(cleantxt,col.names = FALSE,original_ctype)