使用R,我试图抓取一个网页,将日文文本保存到文件中。最终,这需要扩展到每天处理数百页。我已经在Perl中有一个可行的解决方案,但我正在尝试将脚本迁移到R以减少在多种语言之间切换的认知负荷。到目前为止,我没有成功。相关问题似乎是this one on saving csv files和this one on writing Hebrew to a HTML file。但是,我没有成功地根据那里的答案拼凑出一个解决方案。修改:this question on UTF-8 output from R is also relevant but was not resolved.
这些页面来自Yahoo!日本财务和我的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")
此R脚本生成下面屏幕截图中显示的输出。基本上是垃圾。
我假设有一些HTML,文本和文件编码的组合,这将允许我在R中生成类似于Perl解决方案的结果,但我找不到它。我试图抓取的HTML页面的标题说图表集是utf-8,我已经在getURL
调用和write.table
函数中将编码设置为utf-8,但仅此一项还不够。
问题 如何使用R抓取上述网页并将文本保存为“格式良好”的日文文本中的CSV而不是看起来像线条噪音的内容?
编辑:我添加了进一步的屏幕截图,以显示省略Encoding
步骤时会发生什么。我看起来像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 stats graphics grDevices utils数据集方法库
答案 0 :(得分:10)
我似乎找到了一个答案,其他人还没有发布一个,所以现在就这样了。
早些时候@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, "c:/geturl_r.txt", quote = FALSE, row.names = FALSE, sep = "\t", fileEncoding = "UTF-8")
Sys.setlocale("LC_CTYPE", original_ctype)
所以我们必须以编程方式搞乱语言环境。坦率地说,我有点尴尬,因为我们在2012年显然需要在Windows上使用R这样的kludge。正如我上面提到的,Perl在相同版本的Windows和相同的语言环境中以某种方式解决了问题,而不需要我更改我的系统设置。
上面更新的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","japanese")
txt <- getURL(links, .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, "c:/geturl_r.txt", col.names = FALSE, quote = FALSE, row.names = FALSE, sep = "\t", fileEncoding = "UTF-8")
Sys.setlocale("LC_CTYPE", original_ctype)
答案 1 :(得分:0)
您好我已经编写了一个抓取引擎,允许在主页列表中深深嵌入的网页上抓取数据。我想知道在导入R?之前将它用作Web数据的聚合器是否有帮助?
引擎的位置在这里 http://ec2-204-236-207-28.compute-1.amazonaws.com/scrap-gm
我为抓取你想到的页面而创建的示例参数如下所示。
{
origin_url: 'http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203',
columns: [
{
col_name: 'links_name',
dom_query: 'a'
}, {
col_name: 'links',
dom_query: 'a' ,
required_attribute: 'href'
}]
};