R用于循环不需要的覆盖

时间:2017-02-24 23:08:54

标签: r for-loop web-scraping rcurl rvest

我希望循环的每个结果都在不同的文本(somename)中。

现在循环覆盖;

library(rvest)

main.page <- read_html(x = "http://www.imdb.com/event/ev0000681/2016")
urls <- main.page %>% # feed `main.page` to the next step
    html_nodes(".alt:nth-child(2) strong a") %>% # get the CSS nodes
    html_attr("href") # extract the URLs


for (i in urls){
    a01 <- paste0("http://www.imdb.com",i)
    text <- read_html(a01) %>% # load the page
            html_nodes(".credit_summary_item~ .credit_summary_item+ .credit_summary_item .itemprop , .summary_text+ .credit_summary_item .itemprop") %>% # isloate the text
            html_text()
}        

我怎么能以这样的方式对它进行编码:列表中的'i'被添加到for语句中的文本中?

1 个答案:

答案 0 :(得分:3)

巩固我的评论:

main.page <- read_html(x = "http://www.imdb.com/event/ev0000681/2016")
urls <- main.page %>% # feed `main.page` to the next step
    html_nodes(".alt:nth-child(2) strong a") %>% # get the CSS nodes
    html_attr("href") # extract the URLs

texts <- sapply(head(urls, n = 3), function(i) {
  read_html(paste0("http://www.imdb.com", i)) %>%
    html_nodes(".credit_summary_item~ .credit_summary_item+ .credit_summary_item .itemprop , .summary_text+ .credit_summary_item .itemprop") %>%
    html_text()
  }, simplify = FALSE)
str(texts)
# List of 3
#  $ /title/tt5843990/: chr [1:4] "Lav Diaz" "Charo Santos-Concio" "John Lloyd Cruz" "Michael De Mesa"
#  $ /title/tt4551318/: chr [1:4] "Andrey Konchalovskiy" "Yuliya Vysotskaya" "Peter Kurth" "Philippe Duquesne"
#  $ /title/tt4550098/: chr [1:4] "Tom Ford" "Amy Adams" "Jake Gyllenhaal" "Michael Shannon"

如果您使用lapply(...),则会获得未命名的列表,这可能对您有用,也可能不对您有用。相反,使用sapply(..., simplify = FALSE),我们得到一个名为的列表,其中每个名称(在本例中)是从urls检索到的部分网址。

使用sapply而不simplify会导致意外输出。举个例子:

set.seed(9)
sapply(1:3, function(i) rep(i, sample(3, size=1)))
# [1] 1 2 3

有人可能认为这将始终返回一个向量。但是,如果返回的任何单个元素与其他元素的长度不同(例如),则向量将成为列表:

set.seed(10)
sapply(1:3, function(i) rep(i, sample(3, size=1)))
# [[1]]
# [1] 1 1
# [[2]]
# [1] 2
# [[3]]
# [1] 3 3

在这种情况下,最好确定返回值,强制列表:

set.seed(9)
sapply(1:3, function(i) rep(i, sample(3, size=1)), simplify = FALSE)
# [[1]]
# [1] 1
# [[2]]
# [1] 2
# [[3]]
# [1] 3

这样,你总是知道如何引用子回报。 (这是Hadley的purrr包的原则和优点之一:每个函数总是返回一个确切类型的列表。(包还有其他优点。)