R:从使用RCurl的网页中提取“干净”的UTF-8文字

前端之家收集整理的这篇文章主要介绍了R:从使用RCurl的网页中提取“干净”的UTF-8文字前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用R,我试图把网页上的文本保存到一个文件中.最终,这需要每天处理数以百计的页面.我已经在Perl中有一个可行的解决方案,但我正在尝试将脚本迁移到R,以减少多种语言之间切换的认知负担.到目前为止,我没有成功.相关的问题似乎是 this one on saving csv filesthis one on writing Hebrew to a HTML file.然而,我没有成功地在一起解决基于答案的解决方案.编辑: this question on UTF-8 output from R is also relevant but was not resolved.

这些页面来自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")

此R脚本生成下面屏幕截图中显示输出.基本上是垃圾

我假设有一些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)
原文链接:https://www.f2er.com/html/230848.html

猜你在找的HTML相关文章