使用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)
错误原因与解决方案
错误原因
read_html_live()用于处理动态渲染页面,但该网站的表格是静态嵌入HTML的,无需动态加载,使用该函数反而可能导致页面解析异常。- 未检查表格是否成功抓取,若
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
相关产品推荐
相关产品推荐

