rvest的jump_to方法处理含特殊字符URL时出现解析错误求助
解决rvest中jump_to访问含特殊字符URL的报错问题
我之前也碰到过一模一样的情况——Chrome能正常打开的URL,放到rvest里就抛出Could not resolve host: NA的报错,其实核心问题是curl(rvest的底层依赖)对URL的规范性要求比浏览器严格得多,浏览器会自动修正很多不规范的细节,但R不会。针对你给出的URL示例,咱们一步步来解决:
问题根源分析
你的URL里有几个明显的不规范点:
- 存在HTML实体
&,这是HTML里对&的转义,但实际URL里应该用&来分隔参数 - 第一个URL的
title参数前有多余空格,第二个URL的UPCCode前有空格和无效的反引号` - 部分特殊字符没有经过标准URL编码(虽然减号这类符号没问题,但浏览器会自动补处理,curl不会)
具体解决步骤
咱们可以写一个简单的处理函数,把不规范的URL转换成curl能识别的标准格式:
library(rvest) library(urltools) # 定义URL修复函数 fix_url <- function(url) { # 第一步:把HTML实体&替换成真实的& url_clean <- gsub("&", "&", url) # 第二步:移除多余的空格和无效的反引号 url_clean <- gsub("[ `]", "", url_clean) # 第三步:解析URL并对查询参数进行标准URL编码 parsed_url <- url_parse(url_clean) parsed_url$query <- url_encode(parsed_url$query) # 重新组合成规范的URL url_compose(parsed_url) } # 处理你的问题URL problem_url1 <- "http://incrediblewinestore.com/ProductDetail.asp?title= -You-Had-Me-At-Merlot--Napkins&UPCCode=876718049392" problem_url2 <- "http://incrediblewinestore.com/ProductDetail.asp?title=10-BARREL-RASPBERRY-CRUSH-6PK&UPCCode= `851538002611" fixed_url1 <- fix_url(problem_url1) fixed_url2 <- fix_url(problem_url2) # 现在用处理后的URL访问 session <- session(fixed_url1) product_content <- session %>% jump_to(fixed_url1) %>% html_elements("div.product-detail") # 替换成你实际要抓取的元素
为什么Chrome能正常访问?
浏览器(比如Chrome)有一套自动修正机制:它会自动解码HTML实体、忽略无效字符、对未编码的参数补做URL编码,所以即使URL不规范也能正常加载。但curl作为底层网络工具,要求URL必须严格符合RFC标准,所以必须手动处理这些细节。
内容的提问来源于stack exchange,提问作者Adam Sampson
相关产品推荐
相关产品推荐

