Запись цикла в read_html через столбец URL-адресов

#r #rvest

#r #rvest

Вопрос:

Я использую rvest для очистки некоторых корпоративных документов от Комиссии по ценным бумагам и биржам США. Начиная с конкретной компании, я успешно извлек URL-адреса для каждого из их 10 тыс. документов и поместил эти URL-адреса во фрейм данных с именем xcel. Затем я хотел бы дополнительно очистить каждый из этих URL-адресов.

Я думаю, что наиболее разумно использовать цикл for для просмотра каждого URL-адреса в xcel$fullurl столбце, использования read_html функции для каждого из них и извлечения таблицы на каждой странице).

У меня возникли проблемы с получением фактического цикла for для работы. Если вы считаете, что цикл for — это не правильный путь, я хотел бы услышать любые другие советы.

 library(rvest)
library(stringi)

sec<-read_html("https://www.sec.gov/cgi-bin/browse-edgar? 
action=getcompanyamp;CIK=0000072903amp;type=10-kamp;dateb=amp;owner=excludeamp;count=40")
xcel<- sec %>%
 html_nodes("#documentsbutton") %>%
 html_attr("href")
xcel<-data.frame(xcel)
xcel$xcell<-paste0("https://www.sec.gov",xcel$xcell)
xcel$fullurl<-paste0(xcel$xcell,xcel$xcel)
as.character(xcel$fullurl)      #set of URL's that I want to scrape from

#Problem starts here

for (i in xcel$fullurl){
  pageurl<-xcel$fullurl
  phase2 <- read_html(pageurl[i])

hopefully<-phase2 %>%
   html_table("tbody")
  

надеюсь, это должно дать мне следующую таблицу с каждого из
сайтов

Ответ №1:

Вы можете перебирать каждый URL-адрес, используя map / lapply , и извлекать 1-ю таблицу из каждого

 library(rvest)
library(dplyr)
library(purrr)

map(xcel$fullurl, ~ .x %>% read_html() %>%  html_table() %>% .[[1]])

#   Seq                   Description                   Document     Type     Size
#1    1                          10-K       xcel1231201510-k.htm     10-K  6375358
#2    2                 EXHIBIT 10.28       xcelex1028q42015.htm EX-10.28    57583
#3    3                 EXHIBIT 10.29       xcelex1029q42015.htm EX-10.29    25233
#4    4                 EXHIBIT 12.01       xcelex1201q42015.htm EX-12.01    50108
#5    5                 EXHIBIT 21.01       xcelex2101q42015.htm EX-21.01    22841
#.....
  

Это вернет список фреймов данных. Если вы хотите объединить их все в один фрейм данных, вы могли бы использовать map_dfr вместо map .

Комментарии:

1. Спасибо! Это решение сработало отлично, и после более подробного ознакомления с функцией Map я думаю, что смогу использовать его и для дальнейшей работы здесь.