使用rvest解析HTML时遭遇read_xml.raw错误求助
使用rvest解析Markit页面时出现"Failed to parse text"错误的解决思路
问题场景
尝试用rvest解析链接 https://mer.markit.com/br-reg/public/project.jsp?project_id=104000000028782,执行代码:
library(rvest) link <- "https://mer.markit.com/br-reg/public/project.jsp?project_id=104000000028782" page <- link %>% read_html()
出现错误:
Error in read_xml.raw(raw, encoding = encoding, base_url = base_url, as_html = as_html, :
Failed to parse text
错误原因分析
这个错误通常由以下情况导致:
- 服务器返回内容非标准HTML/XML格式(如乱码、空白内容)
- 请求被服务器反爬机制拦截(未模拟浏览器请求特征)
- 页面需登录或验证才能访问,直接请求返回非目标内容
解决步骤
1. 排查请求响应状态与内容
用httr包先获取请求响应,确认服务器返回的实际内容:
library(httr) library(rvest) link <- "https://mer.markit.com/br-reg/public/project.jsp?project_id=104000000028782" # 发送请求 resp <- GET(link) # 查看响应状态码(200表示请求成功) print(status_code(resp)) # 查看返回内容的前500字符,判断是否为目标HTML cat(substr(content(resp, as = "text"), 1, 500))
2. 模拟浏览器请求头
若状态码非200,或返回拦截页面,添加User-Agent模拟浏览器:
resp <- GET(link, add_headers(`User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")) # 尝试解析页面 page <- read_html(resp)
3. 指定编码格式
若返回内容存在编码问题,手动指定编码:
page <- read_html(resp, encoding = "UTF-8")
4. 处理需验证的页面
若返回登录/验证页面,说明站点需要会话验证,此时rvest直接爬取无法完成,可使用RSelenium模拟浏览器完成登录后再解析页面。
内容的提问来源于stack exchange,提问作者Anthony W
相关产品推荐
相关产品推荐

