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

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

概述使用R,我试图把网页上的文本保存到一个文件中.最终,这需要每天处理数以百计的页面.我已经在Perl中有一个可行的解决方案,但我正在尝试将脚本迁移到R,以减少多种语言之间切换的认知负担.到目前为止,我没有成功.相关的问题似乎是 this one on saving csv files和 this one on writing Hebrew to a HTML file.然而,我没有成功地在一起解决基 使用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! 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)
总结

以上是内存溢出为你收集整理的R:从使用RCurl的网页中提取“干净”的UTF-8文字全部内容,希望文章能够帮你解决R:从使用RCurl的网页中提取“干净”的UTF-8文字所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1100847.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存