使用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
相关产品推荐
相关产品推荐

