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

使用R爬取印度政府公开洋葱数据集时遇错误求助

问题:爬取印度Agmarknet洋葱数据时出现下标越界错误

我需要下载印度政府公开的2005年全年各批发市场洋葱日度交易量与价格数据,提取州名、区名、市场名、品种名、商品名、到货量、最低价、最高价、指导价这些变量,但数据量太大无法手动复制。用R写了爬取代码后,出现Error in data[1] : subscript out of bounds错误,不知道怎么解决。

尝试的代码:

library(rvest)
library(dplyr)

# Specify the URL
url <- "https://agmarknet.gov.in/SearchCmmMkt.aspx?Tx_Commodity=23&Tx_State=0&Tx_District=0&Tx_Market=0&DateFrom=01-Jan-2005&DateTo=31-Dec-2005&Fr_Date=01-Jan-2005&To_Date=31-Dec-2005&Tx_Trend=2&Tx_CommodityHead=Onion&Tx_StateHead=--Select--&Tx_DistrictHead=--Select--&Tx_MarketHead=--Select--"

# Read the HTML content from the URL
page <- read_html_live(url)

# Extract the data using CSS selectors or XPath
# Use the 'selectorGadget' tool or browser's Inspect Element to find appropriate CSS selectors or XPath
data <- page %>%
  html_nodes("table#cphBody_GridArrivalData") %>%
  html_table()

# Extracted data will be in a list, you can access it like this:
df <- data[[1]]

# Display the data
print(df)

错误原因与解决方案

错误原因

  1. read_html_live() 用于处理动态渲染页面,但该网站的表格是静态嵌入HTML的,无需动态加载,使用该函数反而可能导致页面解析异常。
  2. 未检查表格是否成功抓取,若html_nodes()未找到目标表格,data会是空列表,直接访问data[[1]]就会触发下标越界错误。

修正后的代码

library(rvest)
library(dplyr)

# 指定目标URL
url <- "https://agmarknet.gov.in/SearchCmmMkt.aspx?Tx_Commodity=23&Tx_State=0&Tx_District=0&Tx_Market=0&DateFrom=01-Jan-2005&DateTo=31-Dec-2005&Fr_Date=01-Jan-2005&To_Date=31-Dec-2005&Tx_Trend=2&Tx_CommodityHead=Onion&Tx_StateHead=--Select--&Tx_DistrictHead=--Select--&Tx_MarketHead=--Select--"

# 读取静态HTML内容(替换动态渲染函数)
page <- read_html(url)

# 定位目标表格并提取数据,指定表头为列名
data <- page %>%
  html_nodes("table#cphBody_GridArrivalData") %>%
  html_table(header = TRUE)

# 检查数据是否存在,避免下标越界
if(length(data) > 0) {
  df <- data[[1]]
  # 筛选需要的变量列(根据实际表头调整名称)
  target_cols <- c("State Name", "District Name", "Market Name", "Variety", "Commodity", 
                   "Arrivals (Tonnes)", "Min Price (Rs./Quintal)", "Max Price (Rs./Quintal)", 
                   "Modal Price (Rs./Quintal)")
  df_filtered <- df %>% select(all_of(target_cols))
  print(df_filtered)
} else {
  cat("未找到目标表格,请检查CSS选择器是否正确。")
}

关键调整说明

  • 替换read_html_live()为read_html():适配静态页面结构,提升解析效率与稳定性。
  • 添加表头参数:html_table(header = TRUE)确保表格第一行被识别为列名,方便后续变量筛选。
  • 增加数据存在性检查:通过length(data) > 0判断是否抓取到表格,避免空列表访问错误。
  • 精准列筛选:根据网站实际表头名称,提取你需要的变量列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:02:16