网络抓取西里尔字母 - 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)的元标记:
我尝试在 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)的元标记: