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

使用R的rvest/httr实现VIES VAT验证:新URL调用失效求助

解决VIES VAT验证URL更新后的R语言获取结果问题

问题原因

新的VIES VAT验证页面是单页应用(SPA),采用前端动态渲染内容。直接发送GET请求到新URL返回的只是基础HTML框架,不会包含验证后的结果元素(比如旧代码依赖的.validStyle),因此静态HTML解析方法失效。

解决方案1:调用官方SOAP API(推荐)

VIES提供官方SOAP接口用于VAT验证,这是最稳定可靠的方式,不受前端页面更新影响。

library(httr)
library(xml2)

# 构造SOAP请求体
soap_body <- '<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ec.europa.eu:taxud:vies:services:checkVat:types">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:checkVat>
         <urn:countryCode>FR</urn:countryCode>
         <urn:vatNumber>23489967794</urn:vatNumber>
      </urn:checkVat>
   </soapenv:Body>
</soapenv:Envelope>'

# 发送POST请求到SOAP API
response <- httr::POST(
  url = "https://ec.europa.eu/taxation_customs/vies/services/checkVatService",
  add_headers(
    "Content-Type" = "text/xml;charset=UTF-8",
    "SOAPAction" = "urn:ec.europa.eu:taxud:vies:services:checkVat:types/checkVat"
  ),
  body = soap_body
)

# 解析XML响应并提取关键信息
xml_content <- content(response, as = "parsed")
valid_status <- xml_find_first(xml_content, "//valid") |> xml_text()
company_name <- xml_find_first(xml_content, "//name") |> xml_text()
company_address <- xml_find_first(xml_content, "//address") |> xml_text()

# 输出结果
cat("验证状态:", valid_status, "\n")
cat("公司名称:", company_name, "\n")
cat("公司地址:", company_address, "\n")

解决方案2:模拟前端表单提交(适配新页面)

如果不想用SOAP API,可以通过抓包新页面的验证请求,模拟发送POST到后端处理接口。当前验证操作实际是发送POST到旧的viesquer.do地址,但需要调整参数和请求方式:

library(rvest)
library(httr)

headers <- c(
  "User-Agent" = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
  "Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
  "Content-Type" = "application/x-www-form-urlencoded"
)

params <- list(
  "action" = "checkVat",
  "countryCode" = "FR",
  "vatNumber" = "23489967794",
  "requesterCountryCode" = "FR",
  "requesterVatNumber" = "23489967794" # 部分场景需填写请求方VAT,可根据需求调整
)

# 发送POST请求
r <- httr::POST(
  url = "https://ec.europa.eu/taxation_customs/vies/viesquer.do",
  add_headers(.headers = headers),
  body = params,
  encode = "form"
)

# 解析结果(若官方调整页面元素,需重新检查DOM结构修改选择器)
result_content <- r |> content() |> html_element(".result-section") |> html_text2()
print(result_content)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:09:30