2010-07-07 8 views
19

C'è un modo semplice in R per estrarre solo gli elementi di testo di una pagina HTML?C'è un modo semplice in R per estrarre solo gli elementi di testo di una pagina HTML?

Penso che questo sia noto come "screen scraping" ma non ne ho esperienza, ho solo bisogno di un modo semplice per estrarre il testo che normalmente si vedrebbe in un browser quando si visita un URL.

+3

Duplicato: http://stackoverflow.com/questions/1844829/how-can-i-read-and-parse-the-contents-of-a-webpage-in-r – Shane

+1

@Shane - La risposta data su quella pagina non sembra funzionare (almeno non più, anche se sono sicuro che ha fatto in quel momento). – JoshuaCrove

+0

Quindi dovremmo aggiustarlo, non avviarne uno nuovo. Oppure fai una domanda direttamente correlata a come quella vecchia risposta non funziona più. – Shane

risposta

18

ho dovuto fare questo, una volta sul tempo di me.

Un modo per farlo è utilizzare le espressioni XPath. Avrete bisogno di questi pacchetti installati dal repository a http://www.omegahat.org/

library(RCurl) 
library(RTidyHTML) 
library(XML) 

Usiamo RCurl per connettersi al sito di interesse. Ha molte opzioni che ti permettono di accedere ai siti web che le funzioni predefinite in R base avrebbero difficoltà con Penso che sia giusto dire. È un'interfaccia R per la libreria libcurl.

Utilizziamo RTidyHTML per pulire pagine Web HTML malformate in modo che siano più semplici da analizzare. È un'interfaccia R per la libreria libtidy.

Utilizziamo XML per analizzare il codice HTML con le nostre espressioni XPath. È un'interfaccia R per la libreria libxml2.

In ogni modo, ecco cosa si fa (codice minimo, ma sono disponibili opzioni, vedere le pagine di aiuto di funzioni corrispondenti):

u <- "http://stackoverflow.com/questions/tagged?tagnames=r" 
doc.raw <- getURL(u) 
doc <- tidyHTML(doc.raw) 
html <- htmlTreeParse(doc, useInternal = TRUE) 
txt <- xpathApply(html, "//body//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)]", xmlValue) 
cat(unlist(txt)) 

Ci possono essere alcuni problemi con questo approccio, ma non riesco a ricordare cosa sono fuori di testa (non penso che la mia espressione xpath funzioni con tutte le pagine web, a volte potrebbe non filtrare il codice dello script o potrebbe semplicemente non funzionare affatto con altre pagine, meglio sperimentare!)

PS Un altro modo, che funziona quasi perfettamente Credo che a web scraping tutto il testo da HTML è il seguente (in pratica ottenere Internet Explorer per eseguire la conversione per voi):

library(RDCOMClient) 
u <- "http://stackoverflow.com/questions/tagged?tagnames=r" 
ie <- COMCreate("InternetExplorer.Application") 
ie$Navigate(u) 
txt <- list() 
txt[[u]] <- ie[["document"]][["body"]][["innerText"]] 
ie$Quit() 
print(txt) 

TUTTAVIA, mi è mai piaciuto fare questo perché non è solo lento, ma se lo si vectorise e si applica un vettore di URL, se Internet Explorer si blocca su una pagina errata, allora R potrebbe bloccarsi o bloccarsi da solo (non credo che in questo caso sia molto utile). Inoltre è incline a consentire i pop-up. Non lo so, è passato un po 'di tempo da quando l'ho fatto, ma ho pensato di farlo notare.

+0

http: // stackoverflow.com/questions/31423931/extract-data-from-raw-html-in-r –

2

Beh, non è esattamente un modo per farlo, ma è semplice come arrivare: plug-in per Firefox. La versione base è gratuita e aiuta ad estrarre tavoli e cose.

ah e se si vuole veramente farlo nel modo più duro in R, questo link è per voi:

2

Ho avuto fortuna con la funzione readHTMLTable() del pacchetto XML. Restituisce un elenco di tutte le tabelle sulla pagina.

> library(XML) 
> url <- 'http://en.wikipedia.org/wiki/World_population' 
> allTables <- readHTMLTable(url) 

Ci possono essere molte tabelle in ogni pagina.

> length(allTables) 
[1] 17 

Quindi basta selezionare quello che si desidera.

> tbl <- allTables[[3]] 

Il problema più grande può essere l'installazione del pacchetto XML. È grande, e ha bisogno della libreria libxml2 (e, sotto Linux, ha bisogno anche del pacchetto Debian xml2-config). Il secondo problema più grande è che le tabelle HTML contengono spesso indesiderate che non si desidera, oltre ai dati desiderati.