Извините за еще один скребковый вопрос.
Мне нужны данные из этой таблицы: http://rspp.ru/tables/non-financial-reports-library/ Содержит нефинансовые отчеты российских компаний. Это законно, чтобы очистить его. Мне нужно сделать некоторый анализ текста для исследовательских целей.
В идеале мне нужен следующий вывод: компания - год - URL-адрес отчета.
Я пытаюсь очистить его, но не могу сопоставить URL-адреса с данными о компании и годе. Вот мой сценарий:
library(rvest)
library(dplyr)
url = "http://rspp.ru/tables/non-financial-reports-library/"
page = read_html(url)
# table
tab = page %>%
html_node("table") %>%
html_table(fill = T)
# links
links = page %>%
html_node("table") %>%
html_nodes("a") %>%
html_attr("href")
Не могли бы вы помочь?
Стол нестандартный. Уродливый способ — реконструировать таблицу, используя значения атрибутов colspan
и rowspan
в столбцах и строках соответственно, чтобы развернуть таблицу в обычный фрейм данных.
Затем вы можете добавить соответствующие заголовки, и для учета объединенных ячеек я просто повторяю один и тот же URL-адрес в соответствующие годы. Я беру текстовое описание за годы, охватываемые данным отчетом, например. 2007–2009 (видно в ячейках со ссылками), но не выводить это, так как в строках заголовков используются годы.
library(rvest)
library(stringr)
url <- 'http://rspp.ru/tables/non-financial-reports-library/'
page <- read_html(url)
headers <- page %>% html_nodes('.company-report-table .register-table__row:nth-child(1) th')%>%html_text()
companies <- page %>% html_nodes('.company-report-table .register-table__row td:nth-child(1) span')%>%html_text()
body_rows <- page %>% html_nodes('.register-table__row ~ .register-table__row')
df <- data.frame(matrix(NA_character_, nrow = length(body_rows), ncol = length(headers)))
n <- 0
for(row in seq_along(body_rows)){
curr_row <- body_rows[[row]]
rspan <- curr_row %>% html_node('td') %>% html_attr('rowspan') %>% as.integer() #rspan tells us how many rows per company
if (!is.na(rspan)){
n <- n + 1
title <- companies[[n]]
}
df[row,1] = title
# handle other columns excluding first
columns_minus_first <- curr_row %>% html_nodes('td:not(:nth-child(1))') # not always 21 range 10 > 21 but we use colspan to expand to 21
c <- 1
for(column in seq_along(columns_minus_first)){
curr_col <- columns_minus_first[[column]]
cspan <- curr_col %>% html_attr('colspan') %>% as.integer() #use cspan value to determine how many years report covers
if (!is.na(cspan)){
link <- paste0('http://rspp.ru', curr_col %>% html_node('a') %>% html_attr('href'))
year <- str_extract(curr_col %>% html_text() ,'\\b[0-9-]{4,9}\\b') #purists may want a tighter regex for year spans
for(i in seq_along(cspan)){ #we will start writing out from col 2 as first col is the company name
df[row,i+c] <- link #repeats for each year covered by report (could alter this for only first)
}
}
c <- c + 1
}
}
colnames(df) <- headers
df <- tibble(df)