2012-06-17 8 views
15

Rを使用して、日本語のテキストをファイルに保存するWebページを削り取ろうとしています。最終的には、毎日何百ものページに取り組むために、これをスケーリングする必要があります。私はすでに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.R:RCurlで掻き集めたWebページから「クリーン」UTF-8テキストを抽出

ページはヤフー日本の財務とこのように見える私の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ファイルを生成します。

CSV file produced by Perl script

なことのように私の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スクリプトは、次のスクリーンショットに示す出力を生成します。基本的にはごみです。

CSV file produced by R script

は、私は私がRでPerlのソリューションと同様の結果を生成することができますHTML、テキストやファイルのエンコーディングのいくつかの組み合わせが存在することを前提としていますが、私はそれを見つけることができません。私が掻き取ろうとしているHTMLページのヘッダーは、チャートセットがutf-8であり、getURLコールとwrite.table関数のエンコーディングをutf-8に設定したとしていますが、これだけでは十分ではありません。

質問 どのようにRを用いて、上記Webページをこすりし、「整形」日本語のテキストではなく、ラインノイズのようなもので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王国。1252の
取り付けられたベースパッケージ: 1統計グラフィックgrDevicesのutilsのデータセットのメソッドベースは

enter image description here

+0

多分あなたは 'エンコーディング(txt)< - "バイト "'を必要とせず、私の環境でうまく動作します。 – kohske

+0

@ kohske、この提案に感謝します。私は 'Encoding()'なしで別の試みをしました。残念ながら私はうまくいかなかった。 – SlowLearner

答えて

10

私は答えを見つけたようですし、誰もがまだので、ここで、1を掲示していないになりました。

@kohskeは、Encoding()コールが削除されると、コードが彼のために働いたとコメントしました。それで私は彼がおそらく日本語のロケールを持っていると思っていました。私のマシン上にロケールの問題があり、たとえPerlが問題を回避していたとしても何らかの形でRに影響することを示唆しました。私は検索を再調整し、オリジナルのポスターが同様の問題に遭遇したUTF-8ファイルを入手することでthis questionを見つけました。答えは、ロケールを切り替えることでした。

Output from updated R code

更新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) 
0

こんにちは、私は深くメインリストページ内に埋め込まれているウェブページ上のデータのスクレイピングを可能こするエンジンを書いています。 Rでのインポートに先立ってウェブデータのアグリゲータとして使用すると便利なのでしょうか?エンジンへ

場所はここ 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' 
    }] 
}; 
関連する問題