Подтвердить что ты не робот

R: извлечение "чистого" текста UTF-8 с веб-страницы, очищенной с помощью RCurl

Используя R, я пытаюсь очистить веб-страницу, чтобы сохранить текст, который находится на японском языке, в файл. В конечном итоге это необходимо масштабировать, чтобы ежедневно обрабатывать сотни страниц. У меня уже есть работоспособное решение в Perl, но я пытаюсь перенести script в R, чтобы уменьшить когнитивную нагрузку переключения между несколькими языками. До сих пор мне не удалось. Связанные вопросы выглядят как этот при сохранении csv файлов и этот при написании иврита в HTML файл. Однако мне не удалось объединить решение, основанное на ответах на них. Edit: этот вопрос на выходе UTF-8 из R также имеет значение, но не был разрешен.

Страницы из 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 script создает CSV файл, который выглядит как снимок экрана ниже, с соответствующими кандзи и канами, которые можно добывать и манипулировать в автономном режиме:

CSV file produced by Perl script

Мой код R, такой как он, выглядит следующим образом. R script не является точным дубликатом только что предоставленного решения Perl, так как он не выделяет HTML и не оставляет текст (этот ответ предлагает подход используя 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 script генерирует результат, показанный на скриншоте ниже. В основном мусор.

CSV file produced by R script

Я предполагаю, что существует некоторая комбинация кодировки HTML, текста и файла, которая позволит мне сгенерировать в R аналогичный результат с решением Perl, но я не могу его найти. Заголовок HTML-страницы, которую я пытаюсь очистить, говорит, что набор диаграмм - utf-8, и я установил кодировку в вызове getURL и в функции write.table для utf-8, но этого недостаточно..

Вопрос Как я могу очистить вышеуказанную веб-страницу с помощью R и сохранить текст как CSV в "хорошо сформированном" японском тексте, а не что-то похожее на линейный шум?

Изменить: я добавил еще один снимок экрана, чтобы показать, что происходит, когда я опускаю шаг Encoding. Я получаю то, что выглядит как коды Unicode, но не графическое представление символов. Это может быть какая-то проблема, связанная с локальностью, но в той же самой локали Perl script предоставляет полезный результат. Так что это все еще озадачивает. Моя информация о сеансе: 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 utils наборы баз данных методы базы

enter image description here

4b9b3361

Ответ 1

Кажется, я нашел ответ, и никто еще не опубликовал его, так что вот здесь.

Ранее @kohske прокомментировал, что код работал для него, как только вызов Encoding() был удален. Это заставило меня подумать, что он, вероятно, имеет японский язык, который, в свою очередь, предположил, что на моей машине была проблема локали, которая каким-то образом влияет на R, даже если Perl избегает проблемы. Я перекомпилировал свой поиск и нашел этот вопрос в поиске файла 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)

Таким образом, мы должны программно испортить локаль. Честно говоря, я немного смущен тем, что нам, по-видимому, нужен такой kludge для R в Windows в 2012 году. Как я уже отмечал выше, 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)

Ответ 2

Привет, я написал механизм скремблирования, который позволяет соскабливать данные на веб-страницах, которые глубоко встроены в главную страницу листинга. Интересно, может ли быть полезным использовать его в качестве агрегатора для ваших веб-данных перед импортом в R?

Местоположение к двигателю находится здесь http://ec2-204-236-207-28.compute-1.amazonaws.com/scrap-gm

Образец параметра I, созданный для очистки страницы, которую вы имели в виду, приведен ниже.

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