2012-06-17 12 views
15

Mit R versuche ich, eine Webseite abzuschaben und den Text, der auf Japanisch ist, in eine Datei zu speichern. Letztendlich muss dies skaliert werden, um täglich Hunderte von Seiten zu bewältigen. Ich habe bereits eine praktikable Lösung in Perl, aber ich versuche, das Skript auf R zu migrieren, um die kognitive Belastung beim Umschalten zwischen mehreren Sprachen zu reduzieren. Bis jetzt bin ich nicht erfolgreich. Verwandte Fragen scheinen this one on saving csv files und this one on writing Hebrew to a HTML file zu sein. Es ist mir jedoch nicht gelungen, eine auf den Antworten basierende Lösung zu finden. Bearbeiten: this question on UTF-8 output from R is also relevant but was not resolved.R: Extrahieren von "sauberem" UTF-8-Text von einer mit RCurl gecrackten Webseite

Die Seiten stammen von Yahoo! Japan Finance und mein Perl-Code, der so aussieht.

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

Diese Perl-Skript erzeugt eine CSV-Datei, die unten wie der Screenshot sieht, mit dem richtigen Kanji und Kana, die abgebaut werden können und offline manipulierten:

CSV file produced by Perl script

Mein R-Code, wie es ist, sieht wie folgt aus. Das R-Skript ist kein exaktes Duplikat der gerade gegebenen Perl-Lösung, da es den HTML-Code nicht ausstreicht und den Text zurücklässt (schlägt einen Ansatz mit R vor, funktioniert aber in diesem Fall nicht) und tut es auch nicht Ich habe die Schleife und so weiter, aber die Absicht ist dieselbe.

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

Dieses R-Skript generiert die Ausgabe, die im folgenden Screenshot gezeigt wird. Im Grunde Müll.

CSV file produced by R script

Ich gehe davon aus, dass es eine Kombination aus HTML, Text und Dateicodierung, die mir in R ein ähnliches Ergebnis zu, dass die Perl-Lösung zu erzeugen, ermöglicht es, aber ich kann es nicht finden. Der Header der HTML-Seite, die ich versuche zu kratzen sagt das Diagrammset ist UTF-8 und ich habe die Codierung in der getURL Anruf und in der write.table Funktion auf UTF-8, aber das allein ist nicht genug.

Die Frage Wie kann ich die oben Web-Seite mit R kratzen und den Text als CSV speichere in „wohlgeformt“ japanischen Text und nicht als etwas, das wie Leitungsrauschen aussieht?

Edit: Ich habe einen weiteren Screenshot hinzugefügt, um zu zeigen, was passiert, wenn ich den Encoding Schritt weglasse. Ich bekomme, was wie Unicode-Codes aussieht, aber nicht die grafische Darstellung der Zeichen. Es kann sich dabei um eine Art von Gebietsschema-Problemen handeln, aber in genau der gleichen Ländereinstellung liefert das Perl-Skript eine nützliche Ausgabe. Das ist also immer noch rätselhaft. Meine Sitzung Info: R Version 2.15.0 gepatchten (2012-05-24 r59442) Plattform: i386-pc-mingw32/i386 (32-Bit) locale: 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 Königreich.1252
angebracht Basispakete: 1 Statistiken Grafiken grDevices utils Datensätze Methoden Basis

enter image description here

+0

vielleicht brauchen Sie nicht 'Encoding (txt) <-" Bytes "' und es funktioniert gut in meiner Umgebung. – kohske

+0

@kohske, danke für diesen Vorschlag. Ich hatte einen anderen Versuch ohne 'Encoding()'; leider war ich erfolglos. – SlowLearner

Antwort

10

scheinen ich sonst eine Antwort und niemand gefunden zu haben, hat noch einen geschrieben, geht so hier.

Früher @kohske kommentiert, dass der Code für ihn arbeitete, sobald der Encoding() Aufruf entfernt wurde. Das brachte mich dazu zu denken, dass er wahrscheinlich ein japanisches Gebietsschema hat, was wiederum andeutete, dass es auf meinem Rechner ein Gebietsschema gab, das irgendwie R betrifft - selbst wenn Perl das Problem vermeidet. Ich rekalibrierte meine Suche und fand this question bei der Suche nach einer UTF-8-Datei, in der das ursprüngliche Poster auf ein ähnliches Problem gestoßen war. Die Antwort bestand darin, das Gebietsschema zu wechseln. Ich experimentierte und fand, dass meine locale japanischen Schalt scheint das Problem zu lösen, wie dieser Screenshot zeigt:

Output from updated R code

Aktualisiert R-Code folgt.

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) 

Also müssen wir programmatisch mit dem Gebietsschema herumspielen. Ehrlich gesagt bin ich ein wenig peinlich, dass wir im Jahr 2012 anscheinend einen solchen Kludus für R unter Windows brauchen. Wie ich oben angemerkt habe, kommt Perl auf der gleichen Windows-Version und im selben locale irgendwie um das Thema herum, ohne dass ich das machen muss ändere meine Systemeinstellungen.

Die Ausgabe des aktualisierten R-Codes oben ist natürlich HTML. Für die Interessierten ist der folgende Code sehr gut darin, den HTML-Code zu entfernen und Rohtext zu speichern, obwohl das Ergebnis ziemlich viel Aufräumen erfordert.

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

Hallo Ich habe geschrieben ein Schaben-Engine, die für das Abschaben von Daten auf Webseiten ermöglicht, die innerhalb der Haupteintragsseite tief eingebettet sind. Ich frage mich, ob es hilfreich sein könnte, sie vor dem Import in R als Aggregator für Ihre Webdaten zu verwenden.

Die Lage zum Motor ist hier http://ec2-204-236-207-28.compute-1.amazonaws.com/scrap-gm

Die Probe Parameter I, wie unten die Seite, die Sie im Sinn hatte, ist zu kratzen erstellt.

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