Соскребите вики раскладной стол с рвестом - PullRequest
3 голосов
/ 16 марта 2020

Раньше я использовал revest для очистки вики, но на этот раз я не могу собрать данные из складной таблицы (первая таблица сообщения):

library(tidyverse)
library(rvest)

url <- "https://es.wikipedia.org/wiki/Anexo:Sondeos_de_intenci%C3%B3n_de_voto_para_las_elecciones_generales_de_Espa%C3%B1a_de_noviembre_de_2019"

sample <- url %>%
  read_html() %>%
  html_nodes(xpath = '/html/body/div[3]/div[3]/div[4]/div/table[1]') %>% 
  html_table(header = T)

Я получаю это сообщение об ошибке :

Ошибка в if (length (p)> 1 & maxp * n! = Sum (unlist (nrows)) & maxp * n! =: Пропущенное значение там, где требуется TRUE / FALSE

У меня такое ощущение, что это связано с вложенными ячейками, но я не могу найти способ удалить первую и последнюю строки.

1 Ответ

1 голос
/ 16 марта 2020

Я не совсем уверен, но rvest может иметь проблемы с таблицей из-за ссылок в шапке. Одним из вариантов является чтение строк вручную, а затем создание требуемого кадра данных. Это не очень элегантное решение, но оно здесь есть.

В этой таблице также есть несколько строк с неполным числом ячеек. Эти строки находятся только в верхнем и нижнем колонтитулах таблицы и не нужны. Я удалил эти строки, преобразовал их в матрицу / фрейм данных и затем переименовал пару столбцов.
Для получения дополнительной информации см. Комментарии к коду.

library(rvest)
url <- "https://es.wikipedia.org/wiki/Anexo:Sondeos_de_intenci%C3%B3n_de_voto_para_las_elecciones_generales_de_Espa%C3%B1a_de_noviembre_de_2019"

page<- url %>% read_html() 
tables<- page%>% html_nodes('table') 

#first attempt
#tables[1] %>% html_table(fill=TRUE)   #Causes an error

#pull the rows
rows<-tables[1] %>% html_nodes('tr') 
#remove rows which do not have the full number cells
rows<- rows[-which(sapply(rows, function(x){length(html_children(x))}) != 20)]

#convert to text
values<-rows %>% html_nodes('td') %>% html_text() %>% trimws()
#create data frame
answer<-as.data.frame(matrix(values, ncol = 20, byrow=TRUE))

#find variable names and rename columns
variablenames <- rows %>% html_nodes('th') %>% html_text() %>% trimws()
names(answer)[which(variablenames !="")] <- variablenames[which(variablenames !="")]

answer

Вам все равно нужно будет переименовать вручную колонка с реальными названиями телестанций.

...