2015-01-07 3 views
7

Я использую пакет rvest для очистки информации со страницы http://www.radiolab.org/series/podcasts. После выскабливания первой страницы, я хочу следовать «Next» ссылку в нижней части, царапать, что вторая страница, перейти на третью страницу, и т.д.Следующая «следующая» ссылка с относительными путями с использованием rvest

Следующая строка выдает ошибку:

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

Проверка HTML показывает, есть некоторый дополнительный хлам вокруг «./2/», что rvest, видимо, не нравится:

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

Вопрос 1: Как я могу получить rvest::follow_link, чтобы правильно обрабатывать эту ссылку, как это делает мой браузер? (Я мог бы вручную захватить «Next» ссылку и очистить его с регулярным выражением, но предпочитают, чтобы воспользоваться преимуществами автоматизации снабженным rvest.)


В конце follow_link кода, он вызывает jump_to. Так что я попытался следующие:

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 

копания в коде, это выглядит как проблема с XML::getRelativeURL, который использует dirname содрать последнюю часть исходного пути («/ подкастов»):

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" 

Вопрос 2: Как я могу получить rvest::jump_to и XML::getRelativeURL правильно обрабатывать относительные пути?

+1

Установите версию dev, где исправлена ​​эта ошибка – hadley

+0

Ну, вторая ошибка; rvest не собирается магически восстанавливать плохие URL-адреса. – hadley

ответ

1

Поскольку эта проблема по-прежнему возникает с RadioLab.com, лучшим решением является создание настраиваемой функции для обработки этого края. Если вы беспокоитесь только об этом сайте - и этой конкретной ошибки - то вы можете написать что-то вроде этого:

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

Это позволит вам писать код так:

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 

Это не сама по себе ошибка - URL-адрес на RadioLab неверен, и ошибка при анализе неверного URL-адреса не является ошибкой. Если вы хотите быть либеральным в том, как вы справляетесь с проблемой, вам необходимо вручную ее обойти.

Обратите внимание, что вы также можете использовать RSelenium, чтобы запустить браузер (например, Chrome) и провести синтаксический анализ URL для вас.

Смежные вопросы