You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用rvest爬取意内政部网站时html_table()无法识别表格

解决rvest无法抓取意大利内政部网站表格的问题

我刚帮你排查了这个目标网站的问题,核心原因很明确:你要找的表格是通过JavaScript动态渲染出来的,而read_html()只能获取页面初始加载的静态HTML内容,自然抓不到JS生成的表格元素——这也是为什么你的代码在维基百科这类静态网站能正常运行,到这个网站就失效了。

下面给你两种可行的解决方案,从易操作到高效优化都有:

方案一:用RSelenium模拟浏览器加载动态内容

RSelenium可以模拟真实浏览器打开页面,等JS完成渲染后再抓取内容,适合新手快速上手:

  1. 先安装并加载所需包:
install.packages(c("RSelenium", "rvest", "dplyr"))
library(RSelenium)
library(rvest)
library(dplyr)
  1. 启动Chrome浏览器驱动(确保你已经安装了Chrome浏览器,且ChromeDriver版本和浏览器匹配):
# 启动本地Chrome驱动,端口可以自定义
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]
  1. 访问目标页面,给页面留足加载时间:
url <- "http://finanzalocale.interno.gov.it/apps/floc.php/certificati/index/codice_ente/1030491450/cod/4/anno/2014/md/0/cod_modello/CCOU/tipo_modello/U/cod_quadro/04"
remDr$navigate(url)

# 等待2秒让JS渲染完成,页面加载慢的话可以延长到3-5秒
Sys.sleep(2)
  1. 获取渲染后的页面源码,再用rvest提取表格:
# 获取完整的页面HTML内容
page_source <- remDr$getPageSource()[[1]]
webpage <- read_html(page_source)

# 用你之前的XPath定位表格
table <- webpage %>%
  html_nodes(xpath='//*[@id="center"]/div[3]/table') %>%
  html_table()

# 查看表格前几行
head(table[[1]])
  1. 用完记得关闭浏览器驱动,避免占用资源:
remDr$close()
driver$server$stop()

方案二:直接抓取后台API数据(更高效稳定)

动态页面的表格数据通常来自后台API接口,跳过浏览器直接请求接口是更优的方案:

  1. 打开浏览器开发者工具(按F12),切换到「网络」标签,刷新页面后,筛选「XHR/Fetch」类型的请求,找到返回表格数据的接口(响应内容通常是JSON或HTML格式)。

  2. 拿到API地址后,用httr包直接请求:

install.packages("httr")
library(httr)
library(jsonlite)

# 替换成你在开发者工具里找到的真实API地址
api_url <- "http://finanzalocale.interno.gov.it/apps/floc.php/certificati/xxx"
response <- GET(api_url)

# 如果返回JSON格式,直接解析成数据框
data <- fromJSON(content(response, "text"))

# 如果返回HTML表格,再用rvest处理
table <- read_html(content(response, "text")) %>% html_table()

这种方法比模拟浏览器更快,也不会受页面加载速度影响,推荐优先尝试。

快速排查小技巧

以后遇到类似问题,可以先检查静态HTML里有没有目标元素:

url <- "http://finanzalocale.interno.gov.it/apps/floc.php/certificati/index/codice_ente/1030491450/cod/4/anno/2014/md/0/cod_modello/CCOU/tipo_modello/U/cod_quadro/04"
webpage <- read_html(url)
# 打印所有table标签
html_nodes(webpage, "table")

如果输出是空的,就说明内容是动态生成的,必须用上面的方法处理。

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

火山引擎 最新活动