You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rvest登录网页报错:未知字段名customer[email]、customer[password]求助

解决rvest登录时的"Unknown field names"错误

Let's walk through fixing this issue step by step — there are two main problems in your code that are causing the error and stopping you from logging in successfully:

1. 「Unknown field names」错误的根源

当你用html_form(pgsession)解析表单时,rvest会提取页面里的实际字段名,但你写的customer[email]、customer[password]和rvest检测到的字段名不匹配。永远不要假设字段名,一定要先查看解析后的表单结构。

在pgform <- html_form(pgsession)之后添加这行代码,就能看到真实的字段名:

print(pgform)

你大概率会发现登录字段的名称是email和password(没有customer[]的包裹),这就是rvest抛出「未知字段名」错误的原因。

2. 你没有提交登录表单!

你当前的代码只是填充了表单,但从未把表单发送给服务器——直接跳转到订单页面自然无法访问需要登录才能查看的内容。

带注释的修正代码

这是修复后的完整代码,每一步都做了对应调整:

library(XLConnect)
library(rvest)

# 1. 初始化会话并加载登录页面
url_login <- "https://www.silversanz.com/es/account/login"
pgsession <- html_session(url_login)

# 2. 解析并检查表单(取消注释可查看字段名)
pgform <- html_form(pgsession)
# print(pgform)  # 运行一次确认字段名

# 3. 使用pgform里的真实字段名填充表单
filled_form <- set_values(
  pgform[[1]],  # 定位第一个(登录)表单
  email = "mymail",  # 替换为你的真实邮箱
  password = "mypass"  # 替换为你的真实密码
)

# 4. 提交表单完成登录
session_after_login <- submit_form(pgsession, filled_form)

# 5. 使用已认证的会话访问订单页面
url_orders <- "https://www.silversanz.com/mi-cuenta/pedidos"
dades <- read_html(session_after_login, url_orders)

# 6. 修正数据提取逻辑(原代码错误使用了html_attr)
date <- dades %>% html_nodes(".order__date") %>% html_text(trim = TRUE)
total <- dades %>% html_nodes(".order__total") %>% html_text(trim = TRUE)
state <- dades %>% html_nodes(".order__state") %>% html_text(trim = TRUE)

# 7. 清理数据并导出
info <- data.frame(date, state, total)
info <- info[complete.cases(info), ]  # 更高效的去NA方式
info <- info[!duplicated(info), ]

writeWorksheetToFile(
  file = "C:/Users/...",  # 替换为你的真实文件路径
  data = info,
  sheet = "item",
  clearSheets = TRUE
)

关键改动说明:

  • 添加了表单检查步骤,确保使用正确的字段名
  • 新增submit_form(),把登录凭证真正发送给服务器
  • 使用认证后的会话session_after_login访问订单页面
  • 修正了数据提取逻辑:用html_nodes(".order__date")定位类名为order__date的元素,再用html_text()获取可见文本(原代码错误尝试获取名为order__date的属性,这个属性并不存在)

如果运行print(pgform)后仍然有字段名错误,直接把输出里的name值原样放到set_values()里即可。

内容的提问来源于stack exchange,提问作者xuriguer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:33:06