You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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
  )
})

错误原因解析

  1. sprintf报错:你手动转义后的URL里的%D8等字符,会被sprintf误认为是格式化占位符(比如%d是整数占位符),但%D不是合法的格式化指令,所以抛出错误。转义成%%就能让sprintf把它们当成普通字符处理。
  2. 直接用阿拉伯字符URL返回404:HTTP协议要求URL中的非ASCII字符必须转换成百分编码,直接传入阿拉伯字符时,R的请求可能没有自动完成编码,导致服务器无法识别路径,返回404。URLencode函数就是帮你完成这个标准编码的步骤。

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

火山引擎 最新活动