You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R的rvest包抓取西里尔文时的编码问题求助

解决R语言rvest抓取俄文网页的乱码问题

针对你遇到的俄文网页抓取乱码、指定UTF-8编码触发错误的问题,根源在于目标网站服务器编码标注与实际返回内容不匹配:页面宣称UTF-8,但实际返回的是windows-1251编码的内容,导致解析时出现非法字节序列。以下是从根源解决的方案:

方案一:手动处理原始响应,修复编码

直接获取原始字节流,先按实际编码解码再转成标准UTF-8,再解析HTML:

library(httr)
library(rvest)

# 目标URL
url <- "https://news-front.su/2022/08/29/glava-odessy-prosit-vlasti-strany-sest-za-stol-peregovorov-s-rossiej/"

# 获取原始响应字节,不自动解析编码
resp <- GET(url)
raw_data <- content(resp, as = "raw")

# 修复编码:先按实际编码windows-1251转成字符,再转成UTF-8
fixed_content <- iconv(rawToChar(raw_data), from = "windows-1251", to = "UTF-8", sub = "ignore")

# 解析修复后的内容为HTML
html <- read_html(fixed_content)

# 测试抓取标题(验证是否正常显示西里尔文)
title <- html_element(html, "h1") %>% html_text()
print(title)

方案二:用编码检测工具辅助确认实际编码

如果不确定实际编码,可使用stringi包检测字节流的编码可能性,再针对性处理:

library(stringi)

# 检测原始字节的编码
encoding_detect <- stri_enc_detect(raw_data)
print(encoding_detect)

检测结果中会列出置信度较高的编码,优先选择windows-1251(俄文网站常见编码)进行后续解码操作。

错误原因说明

你遇到的错误Input is not proper UTF-8,是因为服务器返回的字节流中存在不符合UTF-8规则的序列(如0xD0 0x27)——0xD0是UTF-8双字节字符的起始,但后续的0x27(单引号)不在UTF-8合法的第二字节范围内。这是典型的编码标注错误:服务器将windows-1251编码的内容标记为UTF-8,导致解析工具按错误编码处理,最终出现乱码或解析失败。

内容的提问来源于stack exchange,提问作者mschro04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:33:11