rvest open.connection报错及readHTMLTable非XML内容报错问题求助
报错原因及对应解决方案
报错1:无法为签名‘NULL’的‘readHTMLTable’函数找到继承方法
- 触发原因:传入
XML::readHTMLTable()的参数为NULL值,本质是第一步网页请求就已失败,未拿到有效HTML文档对象就直接调用了表格解析函数。 - 解决方法:
- 拆分执行步骤,先单独发起网页请求校验返回有效性:运行
res <- httr::GET("目标网页URL")后,先判断httr::status_code(res)是否为200,确认请求成功后再执行后续解析操作。 - 不要直接将URL字符串传入
readHTMLTable(),先通过xml2::read_html()解析请求返回的响应内容,再将解析后的HTML对象传入表格提取函数。
- 拆分执行步骤,先单独发起网页请求校验返回有效性:运行
报错2:XML contents does not seem to be XML
- 触发原因:传入解析函数的内容不是合法HTML/XML结构,大概率是请求返回的是反爬拦截页、加密页面、验证码页,或者内容编码格式异常,并非正常网页源码。
- 解决方法:
- 打印请求返回内容的前1000个字符,校验返回的是正常网页源码还是403/503错误页、拦截页等异常内容。
- 给请求添加浏览器UA头模拟正常用户访问,示例代码:
res <- httr::GET("目标URL", httr::user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")) - 解析时明确指定编码格式:
doc <- xml2::read_html(res, encoding = "UTF-8")
报错3:Error in open.connection(x, "rb") : Couldn't connect to server
- 触发原因:R运行环境无法正常连接目标网站服务器,可能是网络限制、网站屏蔽了当前IP、目标站点宕机,或者当前网络需要配置代理才能访问对应站点。
- 解决方法:
- 先在本地浏览器打开目标URL,确认站点本身可以正常访问,排除站点不可用问题。
- 若当前网络需要代理访问,可在R中配置对应代理:
Sys.setenv(http_proxy = "http://你的代理地址:端口", https_proxy = "http://你的代理地址:端口") - 若确认是IP被屏蔽,可尝试更换IP段、增加请求间隔降低爬取频率。
推荐完整执行流程示例
library(httr) library(xml2) library(rvest) # 1. 配置请求头发起访问 ua <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" res <- GET("https://www.theabusites.com/197-nuc-approved-universities-in-nigeria-2021/", user_agent(ua)) # 2. 校验请求状态 if(status_code(res) != 200){ stop("请求失败,状态码:", status_code(res)) } # 3. 解析HTML内容 doc <- read_html(res, encoding = "UTF-8") # 4. 提取表格(优先用rvest的html_table,兼容性优于停止维护的XML包) tables <- html_table(doc, header = TRUE, convert = FALSE) # 查看提取到的表格数量 length(tables)
注意:
XML包已停止维护多年,优先使用rvest::html_table()做表格提取,兼容性和报错提示都更友好。
内容的提问来源于stack exchange,提问作者Ibiloye Abiodun Christian
相关产品推荐
相关产品推荐

