2012-06-17 37 views
15

Sử dụng R, tôi đang cố gắng để cạo một trang web lưu văn bản, đó là tiếng Nhật, vào một tệp. Cuối cùng, điều này cần phải được mở rộng để giải quyết hàng trăm trang trên cơ sở hàng ngày. Tôi đã có một giải pháp khả thi trong Perl, nhưng tôi đang cố gắng di chuyển tập lệnh sang R để giảm tải nhận thức về chuyển đổi giữa nhiều ngôn ngữ. Cho đến nay tôi không thành công. Các câu hỏi liên quan dường như là this one on saving csv filesthis one on writing Hebrew to a HTML file. Tuy nhiên, tôi đã không thành công trong việc trộn lẫn với nhau một giải pháp dựa trên các câu trả lời ở đó. Chỉnh sửa: this question on UTF-8 output from R is also relevant but was not resolved.R: trích xuất văn bản UTF-8 "sạch" từ một trang web được cạo bằng RCurl

Các trang này đến từ Yahoo! Nhật Bản Tài chính và mã Perl của tôi trông như thế này.

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; 
} 

kịch bản Perl này tạo ra một tập tin CSV mà trông giống như hình dưới đây, với kanji phù hợp và kana có thể được khai thác và chế tác ẩn:

CSV file produced by Perl script

đang R của tôi, chẳng hạn như nó là, trông giống như sau. Kịch bản R không phải là bản sao chính xác của giải pháp Perl vừa được đưa ra, vì nó không loại bỏ HTML và để lại văn bản (this answer đề xuất phương pháp sử dụng R nhưng nó không hoạt động trong trường hợp này) và nó không không có vòng lặp và như vậy, nhưng mục đích là như nhau.

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") 

Tập lệnh R này tạo ra kết quả được hiển thị trong ảnh chụp màn hình bên dưới. Về cơ bản rác.

CSV file produced by R script

tôi giả sử rằng có một số sự kết hợp của HTML, văn bản và mã hóa tập tin đó sẽ cho phép tôi tạo ra trong R là một kết quả tương tự như của các giải pháp Perl nhưng tôi không thể tìm thấy nó. Tiêu đề của trang HTML mà tôi đang cố gắng xóa cho biết biểu đồ là utf-8 và tôi đã đặt mã hóa trong cuộc gọi getURL và trong hàm write.table thành utf-8, nhưng điều này không đủ.

Câu hỏi Làm thế nào tôi có thể cạo trang web trên sử dụng R và lưu văn bản như CSV trong "cũng như hình thành" văn bản tiếng Nhật chứ không phải là cái gì đó trông giống như tiếng ồn đường?

Chỉnh sửa: Tôi đã thêm ảnh chụp màn hình khác để hiển thị những gì xảy ra khi tôi bỏ qua bước Encoding. Tôi nhận được những gì trông giống như mã Unicode, nhưng không phải là đại diện đồ họa của các nhân vật. Nó có thể là một loại vấn đề liên quan đến miền địa phương, nhưng trong cùng một ngôn ngữ chính xác, kịch bản Perl cung cấp đầu ra hữu ích. Vì vậy, điều này vẫn còn khó hiểu. tôi thông tin phiên: R phiên bản 2.15.0 Patched (2012-05-24 r59442) Hệ điều hành: i386-pc-mingw32/i386 (32-bit) ngôn ngữ: 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 quốc Anh.1252
gói cơ bản kèm theo: 1 số liệu thống kê đồ họa grDevices utils bộ dữ liệu phương pháp cơ sở

enter image description here

+0

có thể bạn không cần 'Mã hóa (txt) <-" byte "' và nó hoạt động tốt trong môi trường của tôi. – kohske

+0

@kohske, cảm ơn đề xuất này. Tôi đã thử khác mà không có 'Encoding()'; tiếc là tôi đã không thành công. – SlowLearner

Trả lời

10

tôi dường như đã tìm thấy một câu trả lời và không ai khác vẫn chưa đăng một, vì vậy ở đây đi.

Trước đó @kohske nhận xét rằng mã đã hoạt động cho anh ta khi cuộc gọi Encoding() bị xóa. Điều đó khiến tôi nghĩ rằng anh ấy có thể có một miền địa phương của Nhật Bản, từ đó gợi ý rằng có một vấn đề địa phương trên máy của tôi mà bằng cách nào đó ảnh hưởng đến R theo một cách nào đó - ngay cả khi Perl tránh được vấn đề. Tôi đã hiệu chỉnh lại tìm kiếm của mình và tìm thấy this question về tìm nguồn cung cấp tệp UTF-8 trong đó áp phích gốc đã chạy vào một vấn đề tương tự. Câu trả lời liên quan đến việc chuyển đổi ngôn ngữ. Tôi đã thử nghiệm và thấy rằng việc chuyển đổi miền địa phương của tôi để Nhật Bản dường như giải quyết vấn đề, như ảnh chụp màn hình này cho thấy:

Output from updated R code

đang cập nhật R sau.

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) 

Vì vậy, chúng tôi phải lập trình lộn xộn xung quanh với ngôn ngữ. Thành thật mà nói, tôi hơi bối rối khi chúng tôi cần một kludge cho R trên Windows trong năm 2012. Như tôi đã lưu ý ở trên, Perl trên cùng một phiên bản Windows và trong cùng một miền địa phương được làm tròn vấn đề bằng cách nào đó, mà không yêu cầu tôi thay đổi cài đặt hệ thống của tôi.

Đầu ra của mã R được cập nhật ở trên là HTML, tất nhiên. Đối với những người quan tâm, mã sau thành công khá tốt trong việc loại bỏ HTML và lưu văn bản thô, mặc dù kết quả cần khá nhiều việc dọn dẹp.

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

Xin chào, tôi đã viết một công cụ cạo cho phép tìm kiếm dữ liệu trên các trang web được nhúng sâu trong trang danh sách chính. Tôi tự hỏi nếu nó có thể hữu ích để sử dụng nó như là một aggregator cho dữ liệu web của bạn trước khi nhập khẩu trong R?

Các vị trí để động cơ là ở đây http://ec2-204-236-207-28.compute-1.amazonaws.com/scrap-gm

Tham số mẫu tôi tạo ra để cạo trang web mà bạn đã có trong tâm trí là như dưới đây.

{ 
    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' 
    }] 
};