Date Редакция Категория comp Теги R

В пакете R вы легко можете скачать содержимое веб-страницы с помощью функции html библиотеки rvest

> library(rvest)
> content <- html(url)

Здесь переменная url — это строка с URL (например, "https://ru.wikipedia.org/"); content — строка, в которую сохраняется содержимое страницы с заданным URL.

И все идет гладко до тех пор, пока в URL не встретятся символы кириллицы.

Собственно говоря, все и потом идет гладко. Только нужно учесть, что символы кириллицы, как и все прочие, кроме весьма ограниченного набора, кодируются в URL так, что становятся нечитабельными. Например, строка адреса:

 https://ru.wikipedia.org/wiki/Микрокредит

кодируется в URL как:

 https://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D1%80%D0%B5%D0%B4%D0%B8%D1%82

Преобразование строки адреса происходит в два этапа: 1) каждый символ кириллицы кодируется в Юникоде (UTF-8) в последовательность из двух байтов; 2) каждый байт этой последовательности записывается в шестнадцатеричном представлении.

Но это все теория. Как наладить, чтобы URL записывались по-русски, а затем автоматически преобразовывались в "процентную" кодировку?

В нашем примере проблемы возникают только с кириллической частью текста. Вот ею и займемся, т.е. строкой page:

> site <- "https://ru.wikipedia.org/wiki/"
> page <- Микрокредит
> url <- paste0(site,page)

Для преобразования в процентную кодировку служит функция curlEscape библиотеки RCurl

> library(RCurl)
> page <- "Микрокредит"
> curlEscape(page)
[1] "%CC%E8%EA%F0%EE%EA%F0%E5%E4%E8%F2"

Заметьте, что результат кодирования отличается от того, что приведен выше, т.е. от

%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D1%80%D0%B5%D0%B4%D0%B8%D1%82

Дело в том, что я использовал версию R под Windows, где кодировкой кириллицы по умолчанию является Windows-1251

> Sys.getlocale()
[1] "LC_COLLATE=Russian_Russia.1251;LC_CTYPE=Russian_Russia.1251;LC_MONETARY=Russian_Russia.1251;LC_NUMERIC=C;LC_TIME=Russian_Russia.1251"

Более того, R под Windows отказывается перейти на UTF-8

> Sys.setlocale("LC_CTYPE", "ru_RU.UTF-8")
[1] ""
Предупреждение:
В Sys.setlocale("LC_CTYPE", "ru_RU.UTF-8") :
  ОС сообщает, что запрос установки локали в "ru_RU.UTF-8" не может быть выполнен

Поэтому перед тем, как кодировать строку в "процентную" кодировку, нужно вначале конвертировать ее из Windows-1251 в UTF-8. Делается это с помощью функции iconv

page_UTF8 <- iconv(page,"Windows-1251","UTF-8")

А вот теперь можно уже использовать curlEscape. Запишем все вместе:

> library(RCurl) # curlEscape
> site <- "https://ru.wikipedia.org/wiki/"
> page <- "Микрокредит"
> page_UTF8 <- iconv(page,"Windows-1251","UTF-8")
> page <- curlEscape(page_UTF8)
> url <- paste0(site,page)
> url
[1] "https://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D1%80%D0%B5%D0%B4%D0%B8%D1%82"

Для Linux и других ОС с "родной" кодировкой UTF-8 шаг с iconv можно опустить и сразу использовать curlEscape.



Комментарии

comments powered by Disqus