В пакете 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