2010-07-07 9 views
19

Gibt es einen einfachen Weg in R, um nur die Textelemente einer HTML-Seite zu extrahieren?Gibt es einen einfachen Weg in R, um nur die Textelemente einer HTML-Seite zu extrahieren?

Ich denke, das ist bekannt als "screen scraping", aber ich habe keine Erfahrung damit, ich brauche nur eine einfache Möglichkeit, den Text zu extrahieren, die Sie normalerweise in einem Browser beim Besuch einer URL sehen würden.

+3

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

+1

@Shane - Die Antwort gegeben auf dieser Seite scheint nicht zu funktionieren (zumindest nicht mehr, obwohl ich sicher bin, dass es zu der Zeit war). – JoshuaCrove

+0

Dann sollten wir es reparieren, nicht ein neues beginnen. Oder stellen Sie eine Frage, die sich direkt darauf bezieht, wie diese alte Antwort nicht mehr funktioniert. – Shane

Antwort

18

ich dies von der Zeit selbst einmal zu tun hatte.

Eine Möglichkeit besteht darin, XPath-Ausdrücke zu verwenden. Sie werden diese Pakete aus dem Repository installiert müssen bei http://www.omegahat.org/

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

Wir verwenden RCurl auf der Website von Interesse zu verbinden. Es hat viele Optionen, mit denen Sie auf Websites zugreifen können, die die Standardfunktionen in Base R schwer haben würden. Ich denke, es ist fair zu sagen. Es ist eine R-Schnittstelle zur libcurl-Bibliothek.

Wir verwenden RTidyHTML, um fehlerhafte HTML-Webseiten zu bereinigen, damit sie einfacher zu analysieren sind. Es ist eine R-Schnittstelle zur libtidy-Bibliothek.

Wir verwenden XML, um den HTML-Code mit unseren XPath-Ausdrücken zu analysieren. Es ist eine R-Schnittstelle zur Bibliothek libxml2.

Sowieso ist hier, was Sie tun (minimal-Code, aber Optionen stehen zur Verfügung, Hilfeseiten von entsprechenden Funktionen):

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)) 

Es kann einige Probleme mit diesem Ansatz, aber ich kann mich nicht erinnern, was Sie sind über meinem Kopf (ich glaube nicht, dass mein XPath-Ausdruck mit allen Webseiten funktioniert, manchmal kann er Skriptcode nicht herausfiltern oder er funktioniert einfach nicht mit anderen Seiten, am besten zum Experimentieren!)

PS Eine weitere Möglichkeit, die fast perfekt funktioniert denke ich an Web den gesamten Text von HTML Schaben ist die folgende (im Grunde Internet Explorer immer für Sie die Konvertierung zu tun):

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) 

Allerdings habe ich nie gemocht dies zu tun, weil nicht nur ist es langsam, aber wenn Sie es vektorisieren und einen Vektor von URLs anwenden, wenn Internet Explorer auf einer schlechten Seite abstürzt, dann könnte R hängen oder sich selbst abstürzen (ich glaube nicht? Versuch hilft in diesem Fall so viel). Es ist auch anfällig für Pop-ups. Ich weiß es nicht, es ist eine Weile her, seit ich das getan habe, aber ich dachte, ich sollte darauf hinweisen.

+0

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

2

Nun, es ist nicht gerade ein R-Weg, aber es ist so einfach wie es kommt: Outwit-Plugin für Firefox. Die Basisversion ist kostenlos und hilft Tabellen zu extrahieren.

ah und wenn Sie wirklich will es auf die harte Art und Weise in R zu tun, diese link ist für Sie:

2

Ich hatte Glück mit der readHTMLTable() - Funktion des XML-Pakets. Es gibt eine Liste aller Tabellen auf der Seite zurück.

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

Es kann viele Tabellen auf jeder Seite geben.

> length(allTables) 
[1] 17 

Wählen Sie einfach die gewünschte aus.

> tbl <- allTables[[3]] 

Der größte Ärger kann die Installation des XML-Pakets sein. Es ist groß und benötigt die Bibliothek libxml2 (und unter Linux benötigt es auch das Debian-Paket xml2-config). Der zweithäufigste Nachteil ist, dass HTML-Tabellen neben den Daten, die Sie wollen, häufig Junk enthalten, den Sie nicht möchten.

Verwandte Themen