R语言网页爬取时URL特殊字符转码问题求助
解决含阿拉伯字符的URL爬取问题
你的问题核心出在sprintf对URL中百分号的解析冲突,以及阿拉伯字符未正确编码为HTTP标准的百分编码这两点上,下面分两种方案帮你解决:
方案1:用paste0+URLencode拼接编码URL(推荐)
直接保留原始阿拉伯字符的URL前缀,通过paste0拼接页码后,用URLencode把非ASCII字符转换成服务器能识别的百分编码,完全避开sprintf的格式化冲突:
library(purrr) library(rvest) # 保留原始阿拉伯字符的基础URL base_url <- "https://sa.aqar.fm/عقارات/" df1 <- map_df(1:5, function(i) { # 拼接页码后,对整URL进行编码(reserved=TRUE保留HTTP特殊字符) full_url <- URLencode(paste0(base_url, i), reserved = TRUE) pg <- read_html(full_url) data.frame( Title=html_text(html_nodes(pg, ".listTitle")), Price=html_text(html_nodes(pg, ".price")), Address=html_text(html_nodes(pg, ".details")), stringsAsFactors=FALSE ) })
方案2:转义URL中的百分号后用sprintf
如果你习惯用sprintf,需要把URL中所有字面意义的%转义成%%(sprintf中%%代表一个普通的百分号),这样sprintf就不会把%D8这类编码当成格式化指令了:
library(purrr) library(rvest) # 把每个%替换成%%,避免sprintf解析错误 url_1 <- 'https://sa.aqar.fm/%%D8%%B9%%D9%%82%%D8%%A7%%D8%%B1%%D8%%A7%%D8%%AA/%d' df1 <- map_df(1:5, function(i) { full_url <- sprintf(url_1, i) pg <- read_html(full_url) data.frame( Title=html_text(html_nodes(pg, ".listTitle")), Price=html_text(html_nodes(pg, ".price")), Address=html_text(html_nodes(pg, ".details")), stringsAsFactors=FALSE ) })
错误原因解析
- sprintf报错:你手动转义后的URL里的
%D8等字符,会被sprintf误认为是格式化占位符(比如%d是整数占位符),但%D不是合法的格式化指令,所以抛出错误。转义成%%就能让sprintf把它们当成普通字符处理。 - 直接用阿拉伯字符URL返回404:HTTP协议要求URL中的非ASCII字符必须转换成百分编码,直接传入阿拉伯字符时,R的请求可能没有自动完成编码,导致服务器无法识别路径,返回404。
URLencode函数就是帮你完成这个标准编码的步骤。
内容的提问来源于stack exchange,提问作者Reem




