2015-11-08 2 views
1

Я использую rvest для очистки данных из некоторых таблиц javascript, таких как здесь. https://tipping.portadelaidefc.com.au/comp/the-alberton-crowdR: Очистка заголовка заголовка каждой ячейки таблицы с использованием rvest

Как вы можете видеть, в этой таблице каждая ячейка имеет значение, а также когда вы наводите указатель мыши, имеет другое прикрепленное значение.

У меня нет никаких проблем выскабливания таблицы, используя rvest как так:

tips <- read_html("https://tipping.portadelaidefc.com.au/comp/the-alberton-crowd") %>% 
    html_table(header=TRUE) 

Но я не уверен, как царапать значения при наведении курсора мыши. Могу ли я сделать это с помощью rvest?

ответ

3

Вы можете расширить/изменить метод rvest:::html_table.xml_node следующим образом:
см R комментарии

my_html_table <- function(x, header = NA, trim = TRUE, fill = FALSE, dec = ".", attr_name = ""){ 
    rows <- html_nodes(x, "tr") 
    n <- length(rows) 
    cells <- lapply(rows, "html_nodes", xpath = ".//td|.//th") 
    ncols <- lapply(cells, html_attr, "colspan", default = "1") 
    ncols <- lapply(ncols, as.integer) 
    p <- unique(vapply(ncols, sum, integer(1))) 
    if (length(p) > 1) { 
    if (!fill) { 
     stop("Table has inconsistent number of columns. ", 
      "Do you want fill = TRUE?", call. = FALSE) 
    } 
    else { 
     p <- max(p) 
    } 
    } 
############################# 
## The following line is the only one that was changed 
############################# 
    values <- lapply(cells, html_attr, attr_name) 
# insted of 
# values <- lapply(cells, html_text, trim = trim) 
    out <- matrix(NA_character_, nrow = n, ncol = p) 
    for (i in seq_len(n)) { 
    row <- values[[i]] 
    ncol <- ncols[[i]] 
    col <- 1 
    for (j in seq_len(p)) { 
     if (j > length(row)) 
     next 
     out[i, col] <- row[[j]] 
     col <- col + ncol[j] 
    } 
    } 
    if (is.na(header)) { 
    header <- all(html_name(cells[[1]]) == "th") 
    } 
    if (header) { 
    col_names <- out[1, , drop = FALSE] 
    out <- out[-1, , drop = FALSE] 
    } else { 
    col_names <- paste0("X", seq_len(ncol(out))) 
    } 
    df <- lapply(seq_len(p), function(i) { 
    utils::type.convert(out[, i], as.is = TRUE, dec = dec) 
    }) 
    names(df) <- col_names 
    class(df) <- "data.frame" 
    attr(df, "row.names") <- .set_row_names(length(df[[1]])) 
    df 
} 

теперь вы можете сделать что-то вроде этого, чтобы «слить» исходные данные с данными подсказки

require(rvest) 
doc <- read_html("https://tipping.portadelaidefc.com.au/comp/the-alberton-crowd") 
x <- doc %>% html_node("table") 
tips <- x %>% my_html_table(attr_name = "title") 
dat <- doc %>% html_table() %>% `[[`(1) 

tips[,c(1,2,28,29)] <- dat[,c(1,2,28,29)] 
tips[1:2,] <- dat[1:2,] 

который дает

> head(tips) 

         X1   X2 X3  X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 
1 Leaderboard Select Round:  <NA> NA Overall 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
2      Rank  Name NA   NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
3       1 Gilly2311 NA <NA> 11 53 42 72 51 41 5 45 20 75 39 3 41 18 13 7 58 
4       2  Harts NA <NA> 27 50 56 57 53 28 15 32 8 63 51 1 26 23 21 6 87 
5       3 mygypsyrose NA <NA> 3 49 64 62 35 61 1 37 20 47 53 9 23 0 7 15 38 
6       4 Scraggie_93 NA <NA> 19 58 81 32 39 31 12 54 35 44 44 17 25 15 7 16 38 
    X22 X23 X24 X25 X26 X27 X28 X29 
1 18 19 20 21 22 23    
2 NA NA NA NA NA NA Margin Score 
3 74 52 11 62 80 15 888 146 
4 46 63 18 51 79 4 865 145 
5 48 56 19 12 78 11 748 142 
6 48 53 7 21 75 11 782 142 

взглянуть на советы и Дат, чтобы увидеть их результаты

2

Или сделать это с немного меньшим усилием:

library(rvest) 
library(dplyr) 

pg <- read_html("https://tipping.portadelaidefc.com.au/comp/the-alberton-crowd") 
tips <- html_table(pg, header=TRUE)[[1]] 

bind_rows(lapply(html_nodes(pg, "tbody > tr"), function(x) { 
    cbind.data.frame(t(c(html_text(html_nodes(x, "td"))[2], 
         html_attr(html_nodes(x, "td.tooltip"), "title")))) 
})) 

##     1  2  3  4  5  6  7  8  9 10 11 12 
##    (chr) (chr) (chr) (chr) (chr) (chr) (chr) (chr) (chr) (chr) (chr) (chr) 
## 1  Gilly2311 11 53 42 72 51 41  5 45 20 75 39 
## 2   Harts 27 50 56 57 53 28 15 32  8 63 51 
## 3  mygypsyrose  3 49 64 62 35 61  1 37 20 47 53 
## 4  Scraggie_93 19 58 81 32 39 31 12 54 35 44 44 
## 5   Deb1967  4 33 54 60 35 72 21 53 20 118 66 
## 6  svolaris  6 52 45 76 50 24 19 45 19 64 58 
## 7  dazza power 14 56 61 45 62 54  2 64 60 40 36 
## 8 Flamingoflames 28 33 35 83 34 76  1 17  9 83 46 
## 9 FEARTHEBEARD 27 34 47 59 50 59  6 50  5 54 38 
## 10  Jules23 11 35 57 47 42 65 34 38  4 61 37 
## ..   ... ... ... ... ... ... ... ... ... ... ... ... 
## Variables not shown: 13 (chr), 14 (chr), 15 (chr), 16 (chr), 17 (chr), 18 (chr), 19 
## (chr), 20 (chr), 21 (chr), 22 (chr), 23 (chr), 24 (chr) 

переименование столбцов, изменение типа столбца и cbind ИНГ его основной таблица также очень проста.

Смежные вопросы