7

rvestパッケージを使用して、ページhttp://www.radiolab.org/series/podcastsから情報を取得しています。最初のページをスクレイピングした後、下部にある「次へ」リンクをたどり、その2ページ目をスクレイピングし、3ページ目に移動するなど.

次の行でエラーが発生します。

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

rvestHTML を調べると、明らかに気に入らない「./2/」の周りに余分な問題があることがわかります。

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このリンクをブラウザと同じように正しく処理する にはどうすればよいですか? (「次へ」リンクを手動で取得し、正規表現でクリーンアップすることもできますが、提供されている自動化を利用することをお勧めし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

コードを掘り下げると、元のパス (「/podcasts」) の最後の部分を取り除くため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て正しく処理する にはどうすればよいですか?

4

1 に答える 1

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 の解析に失敗してもバグではありません。問題の処理方法に寛大になりたい場合は、手動で回避する必要があります。

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

于 2016-10-09T19:42:10.190 に答える