2015-01-07 12 views
7

rvest का उपयोग कर रहा पेज http://www.radiolab.org/series/podcasts से जानकारी स्क्रैप करने का rvest पैकेज का उपयोग कर रहा लिंक।के बाद "अगला" संबंधित पथ के साथ

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

: प्रथम पृष्ठ scraping के बाद, मैं, तल पर "अगला" लिंक का अनुसरण करें कि दूसरे पृष्ठ स्क्रैप, तीसरे पेज पर ले जाने, आदि

निम्न पंक्ति एक त्रुटि देता है करना चाहते हैं वहाँ एचटीएमएल शो निरीक्षण के आसपास "./2/" कुछ अतिरिक्त cruft है कि 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: मैं कैसेप्राप्त कर सकते हैं इस लिंक का सही ढंग से मेरे ब्राउज़र की तरह व्यवहार करने के लिए 0? follow_link कोड के अंत में (मैं मैन्युअल रूप से "अगला" लिंक हड़पने सकता है और यह साफ regex के साथ है, लेकिन rvest के साथ प्रदान की स्वचालन का लाभ लेने के पसंद करते हैं।)


, यह 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 

कोड में खुदाई, ऐसा लगता है कि इस मुद्दे को जो dirname का उपयोग करता है मूल पथ के अंतिम भाग ("/ पॉडकास्ट") बंद पट्टी, XML::getRelativeURL साथ है:

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

देव संस्करण स्थापित करें जहां यह बग तय किया गया है – hadley

+0

ठीक है दूसरी बग है; कच्चे माल की जादुई मरम्मत की जा रही है। – 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 

यह नहीं है - और इस विशेष त्रुटि - आप इस साइट के बारे में चिंतित हैं, तो फिर तुम कुछ इस तरह लिख सकते हैं प्रति त्रुटि एक त्रुटि - रेडियोलाब पर यूआरएल विकृत है, और एक विकृत यूआरएल पार्स करने में विफल एक बग नहीं है। यदि आप इस मुद्दे को संभालने में उदार होना चाहते हैं तो आपको इसके आसपास मैन्युअल रूप से काम करने की आवश्यकता है।

ध्यान दें कि आप वास्तविक ब्राउज़र (उदा। क्रोम) लॉन्च करने के लिए RSelenium का उपयोग भी कर सकते हैं और यह आपके लिए यूआरएल पार्सिंग कर सकते हैं।

संबंधित मुद्दे