2015-01-07 10 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/ 

:最初のページをこするした後、私はなど

次の行がエラーを与えて、一番下の「次へ」のリンクをたどること、2ページ目をこすり、3ページ目に移動します

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: はどのように私はを得ることができますHTMLを検査するrvestが明らかに好きではないことを「./2/」の周りにいくつかの余分な嫌なものがあることを示し私のブラウザのようにこのリンクを正しく処理するには0? (私は手動で「次へ」のリンクをつかむと、正規表現でそれをクリーンアップするが、rvestを提供する自動化の利点を取ることを好むことができます。)


follow_linkコードの終わりに、それはjump_toを呼び出します。

:だから、私は次のことを試してみました:問題は、元のパス(「/ポッドキャスト」)の最後の部分を取り除くために dirnameを使用する、 XML::getRelativeURLであるよう

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("./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_toXML::getRelativeURLが正しく相対パスを処理するために得ることができますか?

+1

このバグが修正されたdevバージョンをインストールしてください – hadley

+0

もう2番目のバグは、 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 

はこれではない - と、この特定のエラー - あなたはこのサイトについてだけ心配しているなら、あなたはこのような何かを書くことができますそれ自体エラーです - RadioLabのURLが不正です。不正なURLを解析できない場合はバグではありません。問題をどのように処理するかについて自由になりたい場合は、手動で回避する必要があります。

実際のブラウザ(Chromeなど)を起動してURL解析を実行することもできます。

関連する問題