我正试图从this link抓取一些数据。
在三个下拉菜单中依次选择选项 - “裁剪组”,“裁剪”和“品种名称”,然后使用“显示功能”按钮后,可以选择导出到csv。我正在尝试下载作物的所有此类csv文件。
我能够在第一个下拉列表中提取所有选项,如下所示。
library(rvest)
library(httr)
library(tidyverse)
pg <- read_html("http://seednet.gov.in/SeedVarieties/Varietydetail.aspx")
cropgp_nodes <- html_nodes(pg, "select[id='_ctl0_ContentPlaceHolder1_ddlgroup'] option")
crpgps <- data_frame(crpgp = html_text(cropgp_nodes),
value = html_attr(cropgp_nodes, "value"))
crpgps
# A tibble: 24 x 2
crpgp value
<chr> <chr>
1 --Select Crop Group-- --Select Crop Group--
2 CEREALS A01
3 MILLETS A02
4 PULSES A03
5 OILSEEDS A04
6 FIBRE CROPS A05
7 FORAGE CROPS A06
8 SUGAR CROPS A07
9 STARCH CROPS A08
10 NARCOTICS(OTHER CROPS) A09
# ... with 14 more rows
然而,由于它是连续的,我无法获得下一个的选项。
html_nodes(pg, "select[id='_ctl0_ContentPlaceHolder1_ddlCrop'] option")
{xml_nodeset (0)}
在这种情况下如何刮取数据?
答案 0 :(得分:1)
一个选项是使用RSelenium
启动'Selenium'服务器
library(RSelenium)
library(XML)
- 与硒驱动程序连接
rD <- rsDriver()
remDr <- rD[["client"]]
remDr$navigate("http://seednet.gov.in/SeedVarieties/Varietydetail.aspx")
-loop通过已经提取的'crpgp'并使用它来发送密钥以在循环中提取相应的'crop'
v1 <- crpgps$crpgp[-1]
lst <- vector("list", length(v1))
for(i in seq_along(lst)) {
remDr$findElement("id", "_ctl0_ContentPlaceHolder1_ddlgroup")$sendKeysToElement(list(v1[i]))
elem <- remDr$findElement(using="id", value='_ctl0_ContentPlaceHolder1_ddlCrop')
elemtxt <- elem$getElementAttribute("outerHTML")[[1]]
elemxml <- htmlTreeParse(elemtxt, useInternalNodes=TRUE)
key <- xpathSApply(elemxml, "//body//option", xmlValue)[-1]
value <- unlist(xpathSApply(elemxml, "//body//option", xmlAttrs)[-1])
if(length(value)==1 & "--Select Crop--" %in% value) {
lst[[i]] <- NULL
} else lst[[i]] <- data.frame(key, value, stringsAsFactors = FALSE)
}
res <- do.call(rbind, lst)
-output
dim(res)
#[1] 181 2
head(res)
# key value
#1 BARLEY (JAU) A0101
#2 PADDY (DHAN) A0102
#3 TRITICALE A0103
#4 WHEAT (GEHON) A0104
#5 BANYARD MILLET (KUNDIRAIVALLI/SAWAN) A0201
#6 BUCK WHEAT (KASPAT) A0202
- 关闭连接并随后停止服务器
remDr$close()
rD[["server"]]$stop()