网络抓取西里尔字母 - rvest 的编码问题

Webscraping cyrillic letters - encoding issue with rvest

我尝试在 https://www.libnauka.ru/elektronnii-katalog/?PAGEN_1=1 抓取俄语期刊名称,但我遇到了编码问题。

R 不显示 Автоматика и телемеханика,而是显示 Àâòîìàòèêà è òåëåìåõàíèêà

即使使用rvest::guess_encoding()的第一个结果也不行。我也试过 read_html(nauka_url, encoding="UTF-8"),但收到一个错误,告诉我:“输入不正确的 UTF-8,指示编码!”

到目前为止,这是我的代码:

  nauka_url <- "https://www.libnauka.ru/elektronnii-katalog/?PAGEN_1=1"

  nauka_encoding <- rvest::guess_encoding(nauka_url)

  nauka_page <- xml2::read_html(nauka_url, encoding=nauka_encoding[1,1])
  
  nauka_journals <- rvest::html_node(nauka_page, css='#wraps > div > div > div > div > div.block-themes-category.block-themes-category-elems')
  
  nauka_journal_names <- rvest::html_nodes(nauka_journals, css='.edition__title')
  nauka_journal_names <- rvest::html_text(nauka_journal_names)

如何获取正确的西里尔字母?感谢您的帮助!

遇到外国文字(在本例中为西里尔文)时,反复试验过程通常会找到正确的编码类型。

rvest::guess_encoding 正是这样做的 - 根据置信度分数进行猜测。但是,这有时无法识别编码,在这种情况下,手动试错可以解决问题。 阅读 stringi 包的 ?stri_enc_detect,可以找到针对特定语言的不同(广泛)使用的编码样式。 对于西里尔字母,尝试设置编码 "ISO-8859-5""windows-1251""KOI8-R".

与其猜测,不如先检查字符集headers的响应


library(rvest)
#> Loading required package: xml2
#> Warning: package 'xml2' was built under R version 4.0.3
library(stringr)

headers <- httr::GET('https://www.libnauka.ru/elektronnii-katalog/?PAGEN_1=1') %>% 
  httr::headers() %>% 
  .$`content-type`

print(str_match(headers, 'charset=(.*)')[1,2])
#> [1] "windows-1251"

reprex package (v0.3.0)

创建于 2021-01-02

或通过控制台 query the page 本身,例如


或者,确实通过浏览器的元素选项卡检查 meta[charset] 中的说明,即具有字符集属性(不是 fool-proof)的元标记: