2015-01-07 8 views
7

-Paket verwenden, um Informationen von der Seite http://www.radiolab.org/series/podcasts zu kratzen. Nachdem die erste Seite Schaben, möchte ich die „Weiter“ Link am Ende folgen, dass die zweite Seite kratzen, auf die dritte Seite verschieben, usw.Nach "nächsten" Link mit relativen Pfaden mit Hilfe von

Die folgende Zeile einen Fehler gibt:

html_session("http://www.radiolab.org/series/podcasts") %>% follow_link("Next") 
## Navigating to 
##  
##  ./2/ 
## Error in parseURI(u) : cannot parse URI 
##  
##  ./2/ 

Inspizieren des HTML zeigt, dass es einige zusätzliche cruft um die „./2/“ dass rvest mag anscheinend nicht:

html("http://www.radiolab.org/series/podcasts") %>% html_node(".pagefooter-next a") 
## <a href="&#10; &#10;  ./2/ ">Next</a> 

.Last.value %>% html_attrs() 
##     href 
## "\n \n  ./2/ " 

Frage 1: Wie kann ichbekommen 0, um diesen Link richtig zu behandeln, wie mein Browser? (Ich kann manuell den „Weiter“ Link packen und reinigen Sie es mit Regex, aber lieber die Vorteile der Automatisierung mit rvest versehen nehmen.)


Am Ende des follow_link Code, ruft jump_to. Also versuchte ich folgendes:

html_session("http://www.radiolab.org/series/podcasts") %>% jump_to("./2/") 
## <session> http://www.radiolab.org/series/2/ 
## Status: 404 
## Type: text/html; charset=utf-8 
## Size: 10744 
## Warning message: 
## In request_GET(x, url, ...) : client error: (404) Not Found 

Graben in den Code, es sieht aus wie das Problem mit XML::getRelativeURL ist, die dirname verwendet den letzten Teil des ursprünglichen Pfad („/ Podcasts“) abzustreifen:

XML::getRelativeURL("./2/", "http://www.radiolab.org/series/podcasts/") 
## [1] "http://www.radiolab.org/series/./2" 

XML::getRelativeURL("../3/", "http://www.radiolab.org/series/podcasts/2/") 
## [1] "http://www.radiolab.org/series/3" 

Frage 2: Wie kann ich rvest::jump_to und XML::getRelativeURL richtig relative Pfade zu umgehen?

+1

Installieren Sie die dev-Version, wo dieser Fehler behoben ist – hadley

+0

Nun, der zweite Bug ist; Rvest wird keine schlechten URLs auf magische Weise reparieren. – hadley

Antwort

1

Da dieses Problem bei RadioLab.com immer noch auftritt, ist die beste Lösung, eine benutzerdefinierte Funktion zu erstellen, um diesen Randfall zu behandeln. Wenn Sie nur besorgt über diese Website sind - und dieser spezielle Fehler - dann kann man so etwas schreiben:

library(rvest) 

follow_next <- function(session, text ="Next", ...) { 
    link <- html_node(session, xpath = sprintf("//*[text()[contains(.,'%s')]]", text)) 
    url <- html_attr(link, "href") 
    url = trimws(url) 
    url = gsub("^\\.{1}/", "", url) 
    message("Navigating to ", url) 
    jump_to(session, url, ...) 
} 

, dass Sie Code so zu schreiben, würde es ermöglichen:

html_session("http://www.radiolab.org/series/podcasts") %>% 
    follow_next() 

#> Navigating to 2/ 
#> <session> http://www.radiolab.org/series/podcasts/2/ 
#> Status: 200 
#> Type: text/html; charset=utf-8 
#> Size: 61261 

Dies ist nicht per se ein Fehler - die URL auf RadioLab ist fehlerhaft, und es ist kein Fehler, eine fehlerhafte URL zu analysieren. Wenn Sie in der Art und Weise, wie Sie mit dem Problem umgehen, liberal sein wollen, müssen Sie es manuell umgehen.

Beachten Sie, dass Sie auch RSelenium verwenden können, um einen tatsächlichen Browser (z. B. Chrome) zu starten, und führen Sie das URL-Parsing für Sie aus.

Verwandte Themen