2012-06-17 32 views
15

使用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.R:從RCurl抓取的網頁中提取「乾淨的」UTF-8文本

這些網頁來自Yahoo!日本財務和我的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

我認爲有HTML,文本和文件編碼的某種組合,讓我到R中產生類似的結果是,Perl的解決方案,但我不能找到它。我試圖抓取的HTML頁面的標題說,chartset是utf-8,我已經將getURL調用中的編碼和write.table函數中的編碼設置爲utf-8,但這僅僅是不夠的。

如何使用R I颳去上面的網頁並保存文本CSV在「結構良好」的日文文本,而不是東西,看起來像線路噪聲問題?

編輯:我添加了一個進一步的屏幕截圖,以顯示當我省略步驟Encoding時會發生什麼。我看起來像是Unicode代碼,但不是字符的圖形表示。它可能是某種與語言環境相關的問題,但在完全相同的語言環境中,Perl腳本確實提供了有用的輸出。所以這仍然令人困惑。 我的會話信息: ř版本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

我似乎已經找到了答案,並沒有其他人尚未發佈一個,所以這裏去。

早些時候@kohske評論說,一旦Encoding()調用被刪除,代碼就爲他工作。這讓我想到他可能有一個日文語言環境,這又反過來表明我的機器上有一個語言環境問題,它以某種方式影響了R - 即使Perl避免了這個問題。我重新調整了我的搜索範圍,發現this question正在尋找原始海報遇到類似問題的UTF-8文件。答案涉及切換語言環境。我試驗,發現我的切換區域設置爲日本似乎解決了問題,因爲這截圖顯示:

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這種混亂。正如我上面提到的,Perl在相同版本的Windows和相同語言環境中以某種方式繞過這個問題,而不需要我更改我的系統設置。

當然,上面更新的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之前將它用作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' 
    }] 
};