Existe-t-il un moyen simple dans R pour extraire seulement les éléments de texte d'une page HTML?

Existe-t-il un moyen simple en R pour extraire seulement les éléments de texte d'une page HTML?

je pense que c'est connu comme 'screen scraping' mais je n'en ai aucune expérience, j'ai juste besoin d'un moyen simple d'extraire le texte que vous voyez normalement dans un navigateur lors de la visite d'une url.

21
demandé sur JoshuaCrove 2010-07-07 18:04:15

4 réponses

j'ai dû le faire moi-même une fois.

une façon de le faire est d'utiliser les expressions XPath. Vous aurez besoin de ces paquets installés depuis le dépôt à http://www.omegahat.org /

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

nous utilisons RCurl pour nous connecter au site d'intérêt. Il a beaucoup d'options qui vous permettent d'accéder à des sites Web que les fonctions par défaut dans la base R aurait des difficultés avec je pense qu'il est juste de dire. Il est une interface R de la bibliothèque libcurl.

nous utilisons RTidyHTML pour nettoyer les pages HTML malformées afin qu'elles soient plus faciles à analyser. Il s'agit d'une interface en R de la bibliothèque libtidy.

nous utilisons XML pour analyser le code HTML avec nos expressions XPath. Il s'agit d'une interface R vers la bibliothèque libxml2.

de toute façon, voici ce que vous faites (code minimal, mais des options sont disponibles, voir les pages d'aide des fonctions correspondantes):

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

il peut y avoir quelques problèmes avec cette approche, mais je ne me souviens pas de ce qu'ils sont au-dessus de ma tête (Je ne pense pas que mon expression xpath fonctionne avec toutes les pages web, parfois il peut ne pas filtrer le code de script ou il peut tout simplement ne pas fonctionner avec d'autres pages du tout, le meilleur pour expérimenter!)

P. S. une Autre façon, qui fonctionne presque parfaitement, je pense au web grattage tout le texte de html est le suivant (en gros Internet Explorer pour le faire la conversion pour vous):

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) 

cependant, je n'ai jamais aimé faire cela parce que non seulement il est lent, mais si vous le vectoriser et appliquer un vecteur D'URLs, si internet explorer plante sur une mauvaise page, alors R pourrait pendre ou se planter lui-même (Je ne pense pas ?essayez aide beaucoup dans ce cas). Aussi, il est enclin à permettre les pop-ups. Je ne sais pas, ça fait longtemps que je n'ai pas fait ça, mais j'ai pensé que je devrais le souligner.

22
répondu Tony Breyal 2013-03-04 15:22:47

Eh bien ce n'est pas exactement une façon de le faire, mais c'est aussi simple qu'ils viennent: plugin outwit pour firefox. La version de base est gratuite et aide à extraire des tables et des trucs.

ah et si vous voulez vraiment le faire à la dure en R, Ce lien est pour vous:

3
répondu Matt Bannert 2010-07-07 14:21:51

j'ai eu de la chance avec la fonction readHTMLTable() du paquet XML. Elle retourne une liste de tous les tableaux de la page.

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

il peut y avoir plusieurs tableaux sur chaque page.

> length(allTables)
[1] 17

sélectionnez donc celui que vous voulez.

> tbl <- allTables[[3]]

le plus gros problème peut être l'installation du paquet XML. C'est énorme, et il a besoin de la bibliothèque libxml2 (et, sous Linux, il a aussi besoin du paquet Debian XML2-config). Le le deuxième plus gros problème est que les tables HTML contiennent souvent des trucs que vous ne voulez pas, en plus des données que vous voulez.

3
répondu pteetor 2010-07-08 13:31:09

la meilleure solution est le paquet htm2txt.

library(htm2txt)
url <- 'https://en.wikipedia.org/wiki/Alan_Turing'
text <- gettxt(url)

pour plus de détails, voir https://CRAN.R-project.org/package=htm2txt .

0
répondu guest 2018-09-03 02:43:03