15

Rを使用して、日本語のテキストをファイルに保存するWebページをスクレイピングしようとしています。最終的には、これをスケーリングして、毎日数百ページに取り組む必要があります。私はすでに Perl で実行可能なソリューションを持っていますが、スクリプトを R に移行して、複数の言語を切り替える際の認知的負荷を軽減しようとしています。これまでのところ、私は成功していません。関連する質問は、csv ファイルの保存に関するものと、ヘブライ語を HTML ファイルに書き込むことに関するもののようです。ただし、そこにある回答に基づいて解決策をまとめることに成功していません。編集: R からの UTF-8 出力に関するこの質問も関連していますが、解決されていません。

ページは 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 ファイルを生成します。このファイルには、オフラインでマイニングおよび操作できる適切な漢字と仮名が含まれています。

Perl スクリプトによって生成された CSV ファイル

私のRコードは、次のようになります。R スクリプトは、HTML を削除してテキストを残さないため、上記の Perl ソリューションの正確な複製ではありません (この回答は 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 スクリプトは、以下のスクリーンショットに示す出力を生成します。基本ゴミ。

R スクリプトによって生成された CSV ファイル

Perl ソリューションと同様の結果を R で生成できる 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 Kingdom.1252
添付ベースパッケージ: 1統計 グラフィックス grDevices ユーティリティ データセット メソッド ベース

ここに画像の説明を入力

4

2 に答える 2

10

私は答えを見つけたようで、他の誰もまだ答えを投稿していないので、ここに行きます.

以前 @kohske は、Encoding()呼び出しが削除されるとコードが機能したとコメントしました。そのため、彼はおそらく日本語のロケールを持っているのではないかと考えました。これは、私のマシンに何らかの形で R に影響を与えるロケールの問題があることを示唆していました。たとえ Perl が問題を回避したとしてもです。検索を再調整したところ、元のポスターが同様の問題に遭遇した UTF-8 ファイルのソースに関するこの質問が見つかりました。その答えは、ロケールの切り替えでした。このスクリーンショットが示すように、実験したところ、ロケールを日本語に切り替えると問題が解決するように見えることがわかりました。

更新された R コードからの出力

更新された 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)
于 2012-06-18T06:10:31.780 に答える
0

こんにちは、メイン リスト ページに深く埋め込まれた Web ページのデータをスクレイピングできるスクレイピング エンジンを作成しました。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'
    }]
};
于 2013-02-06T10:40:25.183 に答える