Get URL table in R

3

I need to do this here:

library(xml)

URL <- "http://globoesporte.globo.com/futebol/brasileirao-serie-a/"

tabela1 <- readHTMLTable(URL, which = 1, colClasses = )

tabela1$V3 <- NULL

names(tabela1) <- c("Posição","Time")

tabela2 <- readHTMLTable(URL, which = 2)

tabela2$'ÚLT. JOGOS' <- NULL

df.data <- bind_cols(tabela1, tabela2)

df.data$Time <- gsub("[A-Z]{3}$","",df.data$Time)

But without using the XML library, because the application I use does not support it.

    
asked by anonymous 09.11.2017 / 20:30

1 answer

3

As commented by @MarcusNunes, you can do this extraction using rvest : / p>

library(rvest)
URL <- "http://globoesporte.globo.com/futebol/brasileirao-serie-a/"
tabelas <- read_html(URL) %>% html_table()

tabela1 <- tabelas[[1]]
tabela1[[3]] <- NULL
names(tabela1) <- c("Posição","Time")

tabela2 <- tabelas[[2]]
tabela2$'ÚLT. JOGOS' <- NULL

df.data <- dplyr::bind_cols(tabela1, tabela2)
df.data$Time <- gsub("[A-Z]{3}$","",df.data$Time)

If you limit the use of packages, only with r-base you can create your own html_table2 :

pagina <- readLines(URL, encoding = 'UTF-8')

html_table2 <- function(pagina) {
  tabelas <- strsplit(paste(pagina, collapse = "\n"), '<table.*?>')[[1]]
  # remover lixo antes da primeira tabela
  tabelas <- tabelas[-1]

  tabelas_limpas <- lapply(tabelas, function(x) {
    # tirar sujeira posterior a '</table>'
    limpa <- sub('</table>.*', '', x)
  })

  linhas <- lapply(tabelas_limpas, function(x) {
    linhas <- strsplit(x, '<tr.*?>')[[1]]
    sub('</tr.*?>', '', linhas)
  })

  df <- lapply(linhas, function(x) {
    colunas <- lapply(x, function(y) strsplit(y, '<td.*?>')[[1]])
    matriz <- do.call(rbind, colunas)
    limpas <- gsub('</?.+?>', '', matriz) # Remove tags HTML
    limpas <- gsub('\n', '', limpas)
    limpas <- gsub('[\s]{2,}', '', limpas)
    # Remove duas primeiras linhas e a primeira e ultima colunas
    limpas <- limpas[- (1:2), -c(1, ncol(limpas))]
    as.data.frame(limpas)
  })
  df
}

tabelas <- html_table2(pagina)
tabela1 <- tabelas[[1]]
names(tabela1) <- c("Posição","Time")

tabela2 <- tabelas[[2]]
names(tabela2) <- c('P', 'J', 'V', 'E', 'D', 'GP', 'GC', 'SG', '%')

df.data <- dplyr::bind_cols(tabela1, tabela2)
df.data$Time <- gsub("[A-Z]{3}$","",df.data$Time)
    
10.11.2017 / 13:19