2010-09-19 21 views
19

Los dos puestos siguientes son grandes ejemplos de diferentes enfoques de extracción de datos de sitios web y analizarlo en R.Extraer enlaces de la página web utilizando R

Scraping html tables into R data frames using the XML package

How can I use R (Rcurl/XML packages ?!) to scrape this webpage

soy muy nuevo en la programación , y estoy comenzando con R, así que espero que esta pregunta sea bastante básica, pero teniendo en cuenta esas publicaciones anteriores, me imagino que sí.

Todo lo que quiero hacer es extraer enlaces que coincidan con un patrón determinado. Siento que probablemente podría usar RCurl para leer en las páginas web y extraer el método de fuerza bruta utilizando expresiones de cadena. Dicho esto, si la página web está bastante bien formada, ¿cómo podría hacerlo utilizando el paquete XML?

A medida que aprendo más, me gusta "ver" los datos mientras resuelvo el problema. El problema es que algunos de estos enfoques generan listas de listas de listas, etc., por lo que es difícil para alguien que es nuevo (como yo) caminar hacia donde tengo que ir.

Una vez más, soy muy nuevo en todo lo que es la programación, por lo que cualquier ayuda o fragmento de código será muy apreciada.

Respuesta

23

La documentación para htmlTreeParse muestra un método. Aquí hay otro:

> url <- "http://stackoverflow.com/questions/3746256/extract-links-from-webpage-using-r" 
> doc <- htmlParse(url) 
> links <- xpathSApply(doc, "//a/@href") 
> free(doc) 

(puedes colocar el atributo "href" de los enlaces devueltos por pasar "enlaces" a través de "as.vector".)

Mi respuesta anterior:

Un enfoque es utilizar el paquete stringr de Hadley Wickham, que puede instalar con install.packages ("stringr", dep = TRUE).

> url <- "http://stackoverflow.com/questions/3746256/extract-links-from-webpage-using-r" 
> html <- paste(readLines(url), collapse="\n") 
> library(stringr) 
> matched <- str_match_all(html, "<a href=\"(.*?)\"") 

(supongo que algunas personas podrían no aprobar el uso de expresiones regulares aquí.)

matched es una lista de matrices, uno por cada cadena de entrada en el html del vector - ya que tiene una longitud de aquí, emparejado solo tiene un elemento Las coincidencias para el primer grupo de captura se encuentran en la columna 2 de esta matriz (y, en general, el i-ésimo grupo aparecería en la columna (i + 1)).

> links <- matched[[1]][, 2] 
> head(links) 
[1] "https://stackoverflow.com/users/login?returnurl=%2fquestions%2f3746256%2fextract-links-from-webpage-using-r" 
[2] "http://careers.stackoverflow.com"             
[3] "http://meta.stackoverflow.com"              
[4] "/about"                    
[5] "/faq"                    
[6] "/" 
+0

Gracias. Cuando estaba pensando en usar regex, definitivamente iba a usar el paquete de hadley. Le daré una oportunidad a la cima, pero definitivamente creo que esto es lo que necesitaba. – Btibert3

+0

Me gusta mucho el uso de free (doc), ni siquiera sabía que existía tal función y siempre la usaré a partir de ahora. –

13

aún más fácil con rvest:

library(xml2) 
library(rvest) 

URL <- "http://stackoverflow.com/questions/3746256/extract-links-from-webpage-using-r" 

pg <- read_html(URL) 

head(html_attr(html_nodes(pg, "a"), "href")) 

## [1] "//stackoverflow.com"                                   
## [2] "http://chat.stackoverflow.com"                                 
## [3] "//stackoverflow.com"                                   
## [4] "http://meta.stackoverflow.com"                                 
## [5] "//careers.stackoverflow.com?utm_source=stackoverflow.com&utm_medium=site-ui&utm_campaign=multicollider"              
## [6] "https://stackoverflow.com/users/signup?ssrc=site_switcher&returnurl=http%3a%2f%2fstackoverflow.com%2fquestions%2f3746256%2fextract-links-from-webpage-using-r" 
Cuestiones relacionadas