使用R语言rvest提交表单时遭遇enc2utf8(url)错误求助
解决rvest提交表单时
enc2utf8(url)报错问题 我来帮你分析并解决这个用rvest抓取VNDirect交易数据时遇到的报错问题。
问题根源
你遇到的Error in enc2utf8(url) : argument is not a character vector报错,核心原因是你选中的第一个表单没有有效的action属性——简单说就是rvest不知道该把填好的表单数据提交到哪个URL。而另一个页面lich-su-gia.shtml的表单在源码里有明确的提交地址,所以能正常工作。
你可以先验证这一点,运行下面的代码查看表单的action值:
url <- "https://www.vndirect.com.vn/portal/thong-ke-thi-truong-chung-khoan/ket-qua-giao-dich.shtml" page_session <- html_session(url) pgform <- html_form(page_session)[[1]] # 查看表单的提交地址 pgform$action
大概率会返回NULL,这就坐实了问题所在。
两种可行的解决方案
方案1:手动给表单指定提交URL
通过浏览器的开发者工具(F12打开Network标签),可以抓到这个表单实际提交的API地址。对于这个交易统计页面,提交地址通常是https://www.vndirect.com.vn/portal/thong-ke-thi-truong-chung-khoan/ket-qua-giao-dich.ajax。你只需要手动给表单添加这个地址即可:
library(rvest) url <- "https://www.vndirect.com.vn/portal/thong-ke-thi-truong-chung-khoan/ket-qua-giao-dich.shtml" page_session <- html_session(url) pgform <- html_form(page_session)[[1]] # 手动设置表单的提交URL pgform$action <- "https://www.vndirect.com.vn/portal/thong-ke-thi-truong-chung-khoan/ket-qua-giao-dich.ajax" # 填充表单数据 filled_form <- set_values(form = pgform, searchMarketStatisticsView.market = "HOSE", strTradingDate = "06/08/2020") # 提交表单并获取结果 result <- submit_form(page_session, filled_form)
方案2:直接发送POST请求(更稳定)
既然已经知道了表单参数和提交地址,也可以跳过rvest的表单解析步骤,直接用httr包发送POST请求,这种方式更不容易受页面结构变化影响:
library(httr) # 表单提交的API地址 post_url <- "https://www.vndirect.com.vn/portal/thong-ke-thi-truong-chung-khoan/ket-qua-giao-dich.ajax" # 发送POST请求,携带表单参数 response <- POST(post_url, body = list( searchMarketStatisticsView.market = "HOSE", strTradingDate = "06/08/2020" ), encode = "form") # 解析返回的HTML内容 result_html <- content(response, "html")
为什么另一个页面能正常工作?
lich-su-gia.shtml的表单在页面源码中自带了明确的action属性,rvest可以自动识别这个地址并完成提交,所以不会出现URL相关的报错。
内容的提问来源于stack exchange,提问作者Kevin_Nguyen
相关产品推荐
相关产品推荐

