[R-br] Selecionar e copiar conteúdo de página usando apenas o terminal linux

walmes . walmeszeviani em gmail.com
Quarta Abril 30 21:12:36 BRT 2014


Senhores,

Como alguns apontaram os dados que preciso vem dando um curl no url. Com
código python sugerido pelo Alisson de alguma forma identifica a estrutura
com que é organizada os dados e já retorna em tabela. Será que não teria
uma forma de imitar o que python faz pelo R? Eu suspeito que seja uma
estrutura possível de passar um "parsador". Se fosse html ou xml daria para
usar um XML::htmlTreeParse(), mas pelo pouco que conheço é outra forma de
organização. Atualmente eu tô fazendo assim mas eu gostaria de melhorar o
código.

##-----------------------------------------------------------------------------

## Lê e joga em arquivo testo.
system("curl http://www.whoscored.com/Teams/1232 > page.txt")

## Pega só a linha com o conteúdo que interessa e joga em outro
## arquivo. Em seguida substitui as aspas por espaço vazio (quando não
## necessárias, aspas não são bem vindas).
system("grep \"DataStore.prime('stage-player-stat'\" page.txt > line.txt")
system("sed 's/'\\\"'//g' line.txt > Line.txt")

x <- readLines("Line.txt")
str(x)

## 1 quebra.
x <- unlist(strsplit(x, split="\\[\\{"))
str(x)

## 2 quebra.
y <- unlist(strsplit(x[2], split="\\},\\{"))
str(y)

## Substituição de `,` por `;`.
y <- gsub(",(\\S)", ";\\1", y)
str(y)

## Quebra os campos.
z <- strsplit(y, split=";")
str(z)

## Organização.
L <- lapply(z,
            function(w){
                w <- strsplit(w, ":")
                i <- sapply(w, length)==2
                w <- w[i]
                x <- do.call(rbind, w)
                y <- x[,2]
                y <- gsub("\\W", "", y)
                names(y) <- x[,1]
                y
            })

M <- do.call(rbind, L)
M <- as.data.frame(M, stringsAsFactors=FALSE)
M <- as.data.frame(lapply(M,
                          function(x){
                              y <- as.integer(x)
                              if(all(is.na(y))) return(x) else return(y)
                          }), stringsAsFactors=FALSE)
str(M)

##-----------------------------------------------------------------------------

Eu sei que tem partes não elegantes aí. O tratamento dos dados não é
perfeito. Requer muito ajuste fino e é por isso que acredito que deve ter
uma forma mais simples. A minha suspeita é se não tem como imitar o que é
feito pelo python na sugestão do Alisson.

Outro ponto é que essa base de dados tem 57 colunas. Tem muita informação.
Tem valores se o jogador deu ou levou foi drible. Se ele levou cartão
amarelo uma ou duas vezes e se levou vermelho. Veja um recorde do str().

 $ Yellow              : int  0 0 0 1 0 1 0 0 0 0 ...
 $ SecondYellow        : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Red                 : int  0 0 0 0 0 0 0 0 0 0 ...
 $ AerialWon           : int  3 2 5 0 3 0 3 3 1 0 ...
 $ AerialLost          : int  1 0 3 0 2 1 7 1 4 0 ...
 $ WasDribbled         : int  1 2 0 1 1 3 1 1 1 0 ...
 $ Dribbles            : int  0 2 0 0 4 2 0 1 0 0 ...
 $ Height              : int  172 176 189 172 178 167 185 171 179 191 ...
 $ Weight              : int  67 72 86 71 69 58 75 70 81 86 ...

Quantas disputas de bolas aéreas ganhas ou perdidas. Só nessa dá pra ver se
a chance de ganhar uma disputa aérea depende da altura do jogador, um
típico binomial. É muito produtivo trabalhar com dados assim em aula, por
isso o empenho em obtê-los.

Grato a todos pela ajuda, fico no aguardo por qualquer novidade.
Walmes.
​
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20140430/91bf4912/attachment.html>


Mais detalhes sobre a lista de discussão R-br