2015-01-07 15 views
7

używam pakietu rvest do zeskanowania informacji ze strony http://www.radiolab.org/series/podcasts. Po skrobanie pierwszą stronę, chcę podążać za „Dalej” link na dole, zeskrobać tę drugą stronę, przenieść na trzeciej stronie, itpPo "następnym" łączu ze ścieżkami względnymi przy użyciu rvest

Poniższy wiersz daje błąd:

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

Kontrola HTML wskazuje, że jest jakiś dodatkowy cruft wokół „./2/” że rvest najwyraźniej nie lubi:

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/ " 

Pytanie 1: Jak mogę uzyskać rvest::follow_link traktować ten link poprawnie, tak jak robi to moja przeglądarka? (Mogłem ręcznie chwycić „Dalej” link i oczyścić go z regex, ale wolą skorzystać z automatyzacji wyposażonego rvest.)


Na końcu kodu follow_link, wywołuje jump_to. Tak próbowałem następujące:

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 

Kopanie do kodu, wygląda na to, że problem jest z XML::getRelativeURL, który wykorzystuje dirname zdejmować ostatnią część oryginalnej ścieżki („/ podcastów”):

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" 

Pytanie 2: Jak mogę uzyskać rvest::jump_to i XML::getRelativeURL poprawnie obsłużyć ścieżek względnych?

+1

Zainstaluj wersję dev, w której naprawiono ten błąd – hadley

+0

Cóż, drugi błąd jest; rvest nie naprawi w magiczny sposób złych adresów URL. – hadley

Odpowiedz

1

Ponieważ problem ten wydaje się nadal występować w przypadku RadioLab.com, najlepszym rozwiązaniem jest utworzenie niestandardowej funkcji obsługi tego przypadku krawędzi. Jeśli jesteś tylko martwi się o tej stronie - i tego konkretnego błędu - wtedy można napisać coś takiego:

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, ...) 
} 

To pozwoli na pisanie kodu:

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 

To nie jest per se błąd - adres URL w RadioLab jest zniekształcony, a niepowodzenie parsowania nieprawidłowego adresu URL nie jest błędem. Jeśli chcesz być liberalny w sposobie radzenia sobie z problemem, musisz ręcznie obejść go.

Pamiętaj, że możesz również użyć RSelenium do uruchomienia przeglądarki rzeczywistej (np. Chrome) i poprosić o wykonanie analizy adresu URL.

Powiązane problemy