2010-06-08 9 views
11

Quiero utilizar R para raspar esta página: (http://www.fifa.com/worldcup/archive/germany2006/results/matches/match=97410001/report.html) y otros, para obtener los goleadores y los tiempos.Cómo aislar un único elemento de una página web raspada en R

Hasta ahora, esto es lo que tengo:

require(RCurl) 
require(XML) 

theURL <-"http://www.fifa.com/worldcup/archive/germany2006/results/matches/match=97410001/report.html" 
webpage <- getURL(theURL, header=FALSE, verbose=TRUE) 
webpagecont <- readLines(tc <- textConnection(webpage)); close(tc) 

pagetree <- htmlTreeParse(webpagecont, error=function(...){}, useInternalNodes = TRUE) 

y el objeto pagetree ahora contiene un puntero a mi HTML analizada (creo). La parte que quiero es:

<div class="cont")<ul> 
<div class="bold medium">Goals scored</div> 
     <li>Philipp LAHM (GER) 6', </li> 
     <li>Paulo WANCHOPE (CRC) 12', </li> 
     <li>Miroslav KLOSE (GER) 17', </li> 
     <li>Miroslav KLOSE (GER) 61', </li> 
     <li>Paulo WANCHOPE (CRC) 73', </li> 
     <li>Torsten FRINGS (GER) 87'</li> 
</ul></div> 

Pero ahora estoy perdido en cuanto a la forma de aislarlos, y francamente xpathSApply y xpathApply confundir los beejeebies fuera de mí!

Entonces, ¿alguien sabe cómo formular un comando para absorber el elemento contenido en las etiquetas <div class="cont">?

+2

tener cuidado al hacer este tipo de cosas ... En la mayoría de los casos, las organizaciones como la FIFA o la FIBA, NBA etc., no permiten la utilización de sus datos - simplemente declarado: ¡sus datos son de su propiedad! Así que la próxima vez proporcione un código HTML ficticio o simplemente señale un sitio inofensivo. =) – aL3xa

Respuesta

16

Estas preguntas son muy útiles cuando se trata de raspado web y XML en I:

  1. Scraping html tables into R data frames using the XML package
  2. How to transform XML data into a data.frame?

Con respecto a su ejemplo en particular, aunque no estoy seguro de lo desea que se vea la salida, esto obtiene los "objetivos marcados" como un vector de caracteres:

theURL <-"http://www.fifa.com/worldcup/archive/germany2006/results/matches/match=97410001/report.html" 
fifa.doc <- htmlParse(theURL) 
fifa <- xpathSApply(fifa.doc, "//*/div[@class='cont']", xmlValue) 
goals.scored <- grep("Goals scored", fifa, value=TRUE) 

La función xpathSApply obtiene todos los valores que coinciden con los criterios dados, y los devuelve como un vector. Tenga en cuenta que estoy buscando un div con class = 'cont'. El uso de valores de clase suele ser una buena forma de analizar un documento HTML porque son buenos marcadores.

Puede limpiar esto lo que le apetezca:

> gsub("Goals scored", "", strsplit(goals.scored, ", ")[[1]]) 
[1] "Philipp LAHM (GER) 6'" "Paulo WANCHOPE (CRC) 12'" "Miroslav KLOSE (GER) 17'" "Miroslav KLOSE (GER) 61'" "Paulo WANCHOPE (CRC) 73'" 
[6] "Torsten FRINGS (GER) 87'" 
+1

¡Bastante limpio, estaba buscando algo así hace mucho tiempo, pero terminé en Python! ¡Ahora puedo ejecutar el script más pequeño y completar el conjunto de datos! ¡Guay! – aL3xa

Cuestiones relacionadas