2017-04-19 1 views
1

Le code ci-dessous va à la page Accepted articles du Journal R et télécharge le premier article qui a le mot le paquet dedans.Suivre plusieurs liens avec rverst :: follow_link()

library(rvest) 
library(magrittr) 
url_stem <- html_session("https://journal.r- 
project.org/archive/accepted/") 
url_paper <- follow_link(url_stem, "package") %>% 
    follow_link("package") -> url_article 
download.file(url_article$url, destfile = "article.pdf") 

Ce que je voudrais est à télécharger tous les articles qui ont un ou plusieurs mots mathing d'un ensemble donné de mots.

Depuis follow_link() prend une expression, j'ai essayé de faire une boucle sur les termes de recherche - en tenant compte du fait que la fonction renvoie une erreur dans le cas où il ne trouve pas un lien correspondant.

library(rvest) 
library(magrittr) 
url_stem <- html_session("https://journal.r-project.org/archive/accepted/") 
search_terms <- c("package", "model", "linear") 
tryCatch(
    for(i in search_terms) { 
    url_paper <- follow_link(url_stem, search_terms[i]) %>% 
    follow_link(search_terms[i]) -> url_article 
    download.file(url_article$url, destfile = "article.pdf") # Don't how I would write it as article[i=1,2, ...].pdf 
} 
) 

Je reçois l'erreur ci-dessous:

Error in if (!any(match)) { : missing value where TRUE/FALSE needed 

fil This n'a pas été utile car elle permet de résoudre le cas pour tags. Le problème semble simple et pourrait être résolu de manière plus facile, mais c'est probablement parce que le site du journal R est assez soigné. Certains sites sont plutôt en désordre.

Répondre

1

Si c'est le problème que vous tentez de résoudre (trouver les entrées de journal r avec 'package') et non un exemple plus petit pour une tâche plus importante pour un autre site, voici ce que vous pouvez faire:

library(xml2) 
library(stringi) 
library(tidyverse) 

doc <- xml_ns_strip(read_xml("https://journal.r-project.org/rss.atom")) 

xml_find_all(doc, "//entry[contains(., 'ackage')]") %>% 
    map_chr(~{ 
    xml_find_first(.x, ".//link") %>% 
     xml_attr("href") %>% 
     stri_replace_last_fixed("/index.html", "") %>% 
     stri_replace_last_regex("/(RJ-.*)$", "/$1/$1.pdf") 

## [1] "https://journal.r-project.org/archive/2017/RJ-2017-003/RJ-2017-003.pdf" 
## [2] "https://journal.r-project.org/archive/2017/RJ-2017-005/RJ-2017-005.pdf" 
## [3] "https://journal.r-project.org/archive/2017/RJ-2017-006/RJ-2017-006.pdf" 
## [4] "https://journal.r-project.org/archive/2017/RJ-2017-008/RJ-2017-008.pdf" 
## [5] "https://journal.r-project.org/archive/2017/RJ-2017-010/RJ-2017-010.pdf" 
## [6] "https://journal.r-project.org/archive/2017/RJ-2017-011/RJ-2017-011.pdf" 
## [7] "https://journal.r-project.org/archive/2017/RJ-2017-015/RJ-2017-015.pdf" 
## [8] "https://journal.r-project.org/archive/2017/RJ-2017-012/RJ-2017-012.pdf" 
## [9] "https://journal.r-project.org/archive/2017/RJ-2017-016/RJ-2017-016.pdf" 
## [10] "https://journal.r-project.org/archive/2017/RJ-2017-014/RJ-2017-014.pdf" 
## [11] "https://journal.r-project.org/archive/2017/RJ-2017-018/RJ-2017-018.pdf" 
## [12] "https://journal.r-project.org/archive/2017/RJ-2017-019/RJ-2017-019.pdf" 
## [13] "https://journal.r-project.org/archive/2017/RJ-2017-021/RJ-2017-021.pdf" 
## [14] "https://journal.r-project.org/archive/2017/RJ-2017-022/RJ-2017-022.pdf" 
## [15] "https://journal.r-project.org/archive/2016/RJ-2016-031/RJ-2016-031.pdf" 
## [16] "https://journal.r-project.org/archive/2016/RJ-2016-032/RJ-2016-032.pdf" 
## [17] "https://journal.r-project.org/archive/2016/RJ-2016-033/RJ-2016-033.pdf" 
## [18] "https://journal.r-project.org/archive/2016/RJ-2016-034/RJ-2016-034.pdf" 
## [19] "https://journal.r-project.org/archive/2016/RJ-2016-036/RJ-2016-036.pdf" 
## [20] "https://journal.r-project.org/archive/2016/RJ-2016-041/RJ-2016-041.pdf" 
## [21] "https://journal.r-project.org/archive/2016/RJ-2016-043/RJ-2016-043.pdf" 
## [22] "https://journal.r-project.org/archive/2016/RJ-2016-045/RJ-2016-045.pdf" 
## [23] "https://journal.r-project.org/archive/2016/RJ-2016-046/RJ-2016-046.pdf" 
## [24] "https://journal.r-project.org/archive/2016/RJ-2016-047/RJ-2016-047.pdf" 
## [25] "https://journal.r-project.org/archive/2016/RJ-2016-048/RJ-2016-048.pdf" 
## [26] "https://journal.r-project.org/archive/2016/RJ-2016-050/RJ-2016-050.pdf" 
## [27] "https://journal.r-project.org/archive/2016/RJ-2016-052/RJ-2016-052.pdf" 
## [28] "https://journal.r-project.org/archive/2016/RJ-2016-054/RJ-2016-054.pdf" 
## [29] "https://journal.r-project.org/archive/2016/RJ-2016-055/RJ-2016-055.pdf" 
## [30] "https://journal.r-project.org/archive/2016/RJ-2016-056/RJ-2016-056.pdf" 
## [31] "https://journal.r-project.org/archive/2016/RJ-2016-057/RJ-2016-057.pdf" 
## [32] "https://journal.r-project.org/archive/2016/RJ-2016-058/RJ-2016-058.pdf" 
## [33] "https://journal.r-project.org/archive/2016/RJ-2016-059/RJ-2016-059.pdf" 
## [34] "https://journal.r-project.org/archive/2016/RJ-2016-060/RJ-2016-060.pdf" 
## [35] "https://journal.r-project.org/archive/2016/RJ-2016-062/RJ-2016-062.pdf" 

Le flux RSS est une source de raclage beaucoup plus facile.

Même si ce n'est pas la tâche spécifique, je pense que cette ligne:

xml_find_all(doc, "//entry[contains(., 'ackage')]") 

est finalement ce que vous êtes après. Cela trouve toutes les balises entry qui ont cette chaîne n'importe où dans les descendants. Vous pouvez utiliser la logique booléenne XPath dans [] (c'est-à-dire logiquement plusieurs chaînes).