2014-12-04 6 views
9

Korzystam z pakietu XML, aby uzyskać linki od this url.R: Użycie pakietu rvest zamiast pakietu XML do uzyskania linków z adresu URL

# Parse HTML URL 
v1WebParse <- htmlParse(v1URL) 
# Read links and and get the quotes of the companies from the href 
t1Links <- data.frame(xpathSApply(v1WebParse, '//a', xmlGetAttr, 'href')) 

Chociaż ta metoda jest bardzo skuteczna, Użyłem rvest i wydaje się szybciej na analizowanie wstęgę niż XML. Próbowałem html_nodes i html_attrs, ale nie mogę go uruchomić.

+1

'rvest' używa pakietu' XML' do ekstrakcji węzła. To naprawdę nie powinno być szybsze. – hrbrmstr

Odpowiedz

14

Mimo mojego komentarza, oto jak można to zrobić z rvest. Zauważ, że musimy najpierw przeczytać na stronie z htmlParse, ponieważ strona ma typ zawartości ustawiony na text/plain dla tego pliku, a to powoduje, że rvest wywołuje kręcenie.

library(rvest) 
library(XML) 

pg <- htmlParse("http://www.bvl.com.pe/includes/empresas_todas.dat") 
pg %>% html_nodes("a") %>% html_attr("href") 

## [1] "/inf_corporativa71050_JAIME1CP1A.html" "/inf_corporativa10400_INTEGRC1.html" 
## [3] "/inf_corporativa66100_ACESEGC1.html" "/inf_corporativa71300_ADCOMEC1.html" 
## ... 
## [273] "/inf_corporativa64801_VOLCAAC1.html" "/inf_corporativa58501_YURABC11.html" 
## [275] "/inf_corporativa98959_ZNC.html" 

To dodatkowo ilustruje XML podstaw opakowania rvest „S.

UPDATE

rvest::read_html() może obsłużyć to bezpośrednio teraz:

pg <- read_html("http://www.bvl.com.pe/includes/empresas_todas.dat") 
+0

Masz rację, do wydobycia węzła 'rvest' używa' XML'. Omówię na czacie różnicę w czasie dla witryn, w których korzystałem z pakietów. Dziękuję za odpowiedź. – capm

4

Wiem, że szukasz odpowiedzi na rvest, ale tutaj jest inny sposób korzystania z pakietu XML, który może być bardziej wydajny niż to, co robisz.

Czy widziałeś funkcję getLinks() w example(htmlParse)? Używam tej zmodyfikowanej wersji z przykładów, aby uzyskać linki href. Jest to funkcja obsługi, dzięki której możemy zbierać wartości podczas ich odczytu, oszczędzając pamięć i zwiększając wydajność.

links <- function(URL) 
{ 
    getLinks <- function() { 
     links <- character() 
     list(a = function(node, ...) { 
       links <<- c(links, xmlGetAttr(node, "href")) 
       node 
      }, 
      links = function() links) 
     } 
    h1 <- getLinks() 
    htmlTreeParse(URL, handlers = h1) 
    h1$links() 
} 

links("http://www.bvl.com.pe/includes/empresas_todas.dat") 
# [1] "/inf_corporativa71050_JAIME1CP1A.html" 
# [2] "/inf_corporativa10400_INTEGRC1.html" 
# [3] "/inf_corporativa66100_ACESEGC1.html" 
# [4] "/inf_corporativa71300_ADCOMEC1.html" 
# [5] "/inf_corporativa10250_HABITAC1.html" 
# [6] "/inf_corporativa77900_PARAMOC1.html" 
# [7] "/inf_corporativa77935_PUCALAC1.html" 
# [8] "/inf_corporativa77600_LAREDOC1.html" 
# [9] "/inf_corporativa21000_AIBC1.html"  
# ... 
# ... 
+0

Świetna pomoc, nie sprawdzałem przykładów w 'htmlParse', ale zmodyfikowałem swój kod za pomocą sugestii. W tym przypadku "XML" działa świetnie, ale pobieranie cen historycznych z tego [www] (http://www.bvl.com.pe/jsp/cotizacion.jsp?fec_inicio=20100101&fec_fin=20141130&nemonico=SIDERC1) trwa dłużej niż "XML". rvest' robi. – capm

+0

Ceny? Twoje pytanie mówi, że próbujesz uzyskać linki –

+0

Tak, z [tej strony] (http://www.bvl.com.pe/includes/empresas_todas.dat) Próbowałem uzyskać wszystkie linki z witryny, podczas gdy na [tej stronie] (http://www.bvl.com.pe/jsp/cotizacion.jsp?fec_inicio=20100101&fec_fin=20141130&nemonico=SIDERC1) Próbowałem przeanalizować tabelę zawierającą historyczne ceny za wycenę SIDERC1. Użyłem "XML" na obu stronach, ale mogłem użyć tylko "rvest" na drugim. – capm

2
# Option 1 
library(RCurl) 
getHTMLLinks('http://www.bvl.com.pe/includes/empresas_todas.dat') 

# Option 2 
library(rvest) 
library(pipeR) # %>>% will be faster than %>% 
html("http://www.bvl.com.pe/includes/empresas_todas.dat")%>>% html_nodes("a") %>>% html_attr("href") 
+1

Opcja 1 wydaje się nie działać z bieżącą wersją RCurl. –

0

odpowiedź Richard pracuje dla stron HTTP, ale nie strony HTTPS, co potrzebne (Wikipedia). Zastąpiłem funkcję getURL RCurla, jak poniżej:

library(RCurl) 

links <- function(URL) 
{ 
    getLinks <- function() { 
    links <- character() 
    list(a = function(node, ...) { 
     links <<- c(links, xmlGetAttr(node, "href")) 
     node 
    }, 
    links = function() links) 
    } 
    h1 <- getLinks() 
    xData <- getURL(URL) 
    htmlTreeParse(xData, handlers = h1) 
    h1$links() 
} 
Powiązane problemy