Соскоб и петля с Rvest - PullRequest
       48

Соскоб и петля с Rvest

0 голосов
/ 08 декабря 2018

Я рассмотрел несколько ответов на аналогичные вопросы по SO, связанные с этой похожей темой, но ни один из них, похоже, не работает для меня.

( цикл по нескольким URL-адресам в r с rvest )

( Сбор (rvest) нескольких HTML-страниц из списка URL-адресов )

У меня есть список URL-адресов, и я хочу взять таблицу из каждого и добавить ее в основной фрейм данных.

## get all urls into one list
page<- (0:2)
urls <- list()
for (i in 1:length(page)) {
  url<- paste0("https://www.mlssoccer.com/stats/season?page=",page[i])
  urls[[i]] <- url
}


### loop over the urls and get the table from each page
table<- data.frame()
for (j in urls) {
  tbl<- urls[j] %>% 
    read_html() %>% 
    html_node("table") %>%
    html_table()
  table[[j]] <- tbl
}

Первый раздел работает, как и ожидалось, и получает список URL-адресов, которые я хочускрести.Я получаю следующую ошибку:

 Error in UseMethod("read_xml") : 
  no applicable method for 'read_xml' applied to an object of class "list"

Любые предложения о том, как исправить эту ошибку и объединить 3 таблицы в один DF?Я ценю любые советы или указатели.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Попробуйте это:

library(tidyverse)
library(rvest)

page<- (0:2)
urls <- list()
for (i in 1:length(page)) {
  url<- paste0("https://www.mlssoccer.com/stats/season?page=",page[i])
  urls[[i]] <- url
}

### loop over the urls and get the table from each page
tbl <- list()
j <- 1
for (j in seq_along(urls)) {
  tbl[[j]] <- urls[[j]] %>%   # tbl[[j]] assigns each table from your urls as an element in the tbl list
    read_html() %>% 
    html_node("table") %>%
    html_table()
  j <- j+1                    # j <- j+1 iterates over each url in turn and assigns the table from the second url as an element of tbl list, [[2]] in this case
}

#convert list to data frame
tbl <- do.call(rbind, tbl)

table[[j]] <- tbl в конце цикла for в исходном коде не было необходимости, так как мы назначаем каждый URL как элемент списка tbl здесь:tbl[[j]] <- urls[[j]]

0 голосов
/ 08 декабря 2018

Вот ваша проблема:

for (j in urls) {
  tbl<- urls[j] %>% 

Когда вы используете j in urls, значения j не являются целыми числами, они сами являются URL-адресами.

Попробуйте:

for (j in 1:length(urls)) {
  tbl<- urls[[j]] %>% 
    read_html() %>% 
    html_node("table") %>%
    html_table()
  table[[j]] <- tbl
}

Вы также можете использовать seq_along():

for (j in seq_along(urls))
...