如何从R中的HTML选择/选项标签中抓取值

时间:2018-10-11 11:08:05

标签: r web-scraping

我有一个与此问题类似的问题:link

我正在抓取此web page,我想在选项值中下载文本,我的意思是,您可以在其中读取“ Seleccionar municipio”,即html代码中的下一个节点:

<select name="txtMunicipio" id="txtMunicipio" class="inputText"><option value="">-------------------------------------</option>
  <option value="001">ALEGRIA-DULANTZI</option>
  <option value="002">AMURRIO</option>
  <option value="049">AÑANA</option>
  <option value="003">ARAMAIO</option>
  <option value="006">ARMIÑON</option>
  <option value="037">ARRAIA-MAEZTU</option>
  ...
  </select>

我想获得以下信息

ID   Name
001  ALEGRIA-DULANTZI
002  AMURRIO
049  AÑANA
...

所以我尝试过的事情与我之前提到的问题类似,使用R中的下一行:

web_page<-read_html("https://catastroalava.tracasa.es/descargas/?lang=es")

web_page %>% html_nodes("select#txtMunicipio.inputText option") %>% html_attr("value")
web_page %>% html_nodes(".inputText option") %>% html_attr("value")
web_page %>% html_nodes("#txtMunicipio option") %>% html_attr("value")

web_page %>% html_nodes("select#txtMunicipio.inputText option") %>% html_text()
web_page %>% html_nodes(".inputText option") %>% html_text()
web_page %>% html_nodes("#txtMunicipio option") %>% html_text()

但是我得到的是:

character(0)

请,您能帮我在html_nodes函数中输入哪些参数才能下载信息?

预先感谢

1 个答案:

答案 0 :(得分:2)

尽管有关于问题重复的错误断言,但数据仍在页面上。我怀疑您使用了Selector Gadget或某些此类工具来标识呈现的页面节点,却从未查看过网站的原始来源(这是一个非常普遍的问题,这也是我对Selector Gadget十分不屑的原因之一,并且普遍认为在进行任何其他调查之前先使用它。

弹出页面是在页面加载后动态生成的,这是源代码:

enter image description here

我亲自编写了more than a few SO answers,演示了如何获取此类数据,但是我们将忽略这些数据的存在。

通常的想法是获取足够的javascript(由于它基于一个非常老的V8引擎版本,因此可以与V8软件包一起使用),以便让它解析数据,然后将值编组回R。

library(rvest)
library(V8)
library(purrr)

ctx <-v8() # we need to convert javascript to R

pg <- read_html("https://catastroalava.tracasa.es/descargas/?lang=es")

html_nodes(pg, xpath=".//script[contains(., 'ALEGRIA-DULANTZI')]") %>% 
  html_text() %>% 
  gsub("function escribeMunicipios.*$", "", .) %>%  # get rid of everything but the data
  ctx$eval(.)

ctx$get("municipios") %>% 
  setNames(c("ID", "Name"))
##     ID                 Name
## 1  001     ALEGRIA-DULANTZI
## 2  002              AMURRIO
## 3  049                AÑANA
## 4  003              ARAMAIO
## 5  006              ARMIÑON
## 6  037        ARRAIA-MAEZTU
## 7  008   ARRAZUA-UBARRUNDIA
## 8  004           ARTZINIEGA
## 9  009            ASPARRENA
## 10 010                AYALA
## ... goes on ...