【问题标题】:R: extracting "clean" UTF-8 text from a web page scraped with RCurlR:从使用 RCurl 抓取的网页中提取“干净”的 UTF-8 文本
【发布时间】:2012-06-17 08:19:26
【问题描述】:

使用 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,而不是看起来像线条噪音的东西?

编辑:我添加了进一步的屏幕截图,以显示当我省略 Encoding 步骤时会发生什么。我得到了看起来像 Unicode 代码的东西,但不是字符的图形表示。这可能是某种与语言环境相关的问题,但在完全相同的语言环境中,Perl 脚本确实提供了有用的输出。所以这仍然令人费解。 我的会话信息: R 版本 2.15.0 已修补 (2012-05-24 r59442) 平台:i386-pc-mingw32/i386(32位) 语言环境: 1LC_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 datasets methods base

【问题讨论】:

  • 也许你不需要Encoding(txt) &lt;- "bytes",它在我的环境中运行良好。
  • @kohske,感谢您的建议。没有Encoding(),我又尝试了一次;不幸的是,我没有成功。

标签: r web-scraping rcurl


【解决方案1】:

我似乎找到了答案,但还没有其他人发布,所以就这样吧。

早些时候@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 提供这样的组合。正如我上面提到的,相同版本的 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","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)

【讨论】:

    【解决方案2】:

    您好,我编写了一个抓取引擎,允许抓取深深嵌入主列表页面的网页上的数据。我想知道在导入 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'
        }]
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2021-04-19
      • 2011-08-17
      相关资源
      最近更新 更多