xml2::read_xml读取真实存在的URL时报标签不匹配错误如何修复
问题修复结论
该问题可修复。
报错核心原因:请求目标接口时,服务器未返回预期的XML格式数据,实际返回了HTML格式内容(常见触发场景为接口反爬拦截、未明确声明接受XML格式返回、网络拦截返回了提示页),HTML中未闭合的<meta>标签不符合XML语法规范,因此触发标签不匹配的解析错误。
修复方法
方法1:保留XML解析逻辑,补全请求头
请求时携带合法的浏览器标识头,明确告知服务器需要XML格式响应,避免被反爬规则拦截:
library(httr) library(xml2) u <- "https://bank.gov.ua/NBUStatService/v1/statdirectory/ovdp?date=20210112" # 构造带合法头的请求 resp <- GET( u, add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", `Accept` = "application/xml,text/xml;q=0.9,*/*;q=0.8" ) ) # 校验请求是否成功 stop_for_status(resp) # 解析XML内容 f <- read_xml(resp)
方法2:改用更稳定的JSON格式返回
该接口原生支持JSON格式返回,解析容错率更高,只需在URL末尾追加&json参数即可:
library(httr) library(jsonlite) u <- "https://bank.gov.ua/NBUStatService/v1/statdirectory/ovdp?date=20210112&json" resp <- GET(u, add_headers(`User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")) stop_for_status(resp) # 直接解析为结构化数据 ovdp_data <- fromJSON(content(resp, as = "text"))
排查提示:如果补全请求头后仍报错,先确认当前网络可正常访问乌克兰央行官方站点,网络不通时防火墙/运营商返回的HTML拦截页也会触发同类解析错误。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

