#r #web-scraping #rvest
#r #очистка веб-страниц #rvest
Вопрос:
Для побочного проекта я пытаюсь собрать статистику для игроков в НФЛ, связанных с фэнтези-футболом. Я нашел URL-адрес, содержащий нужные мне данные: https://www.cbssports.com/fantasy/football/stats/QB/2020/ytd/stats/ppr /
Я пытаюсь очистить его в R, и мне не повезло. Я перепробовал много вещей, самое близкое, что я получил, это:
Test1 <- read_html("https://www.cbssports.com/fantasy/football/stats/QB/2020/season/projections/ppr/") %>% html_nodes('.TableBase-bodyTr')
Вот код, который у меня есть до сих пор, и вот результат:
Test1
{xml_nodeset (69)}
[1] <tr class="TableBase-bodyTr">n<td class="TableBase-bodyTd n n n n ">n <span class="CellPlayerName--sho ...
[2] <tr class="TableBase-bodyTr">n<td class="TableBase-bodyTd n n n n ">n <span class="CellPlayerName--sho ...
[3] <tr class="TableBase-bodyTr">n<td class="TableBase-bodyTd n n n n ">n <span class="CellPlayerName--sho ...
[4] <tr class="TableBase-bodyTr">n<td class="TableBase-bodyTd n n n n ">n <span class="CellPlayerName--sho ...
Я попытался передать это в html_text(), и я получаю это в результате:
[65] "n n n n n n J. Easonn n n n QBn n n n INDn n n n n n n n
Это просто чистый хаос с соответствующей информацией, встроенной в него. Я также попытался использовать html_table() для этого и просто получил сообщение об ошибке.
Теперь, когда я использую функцию просмотра в «Test1», я могу просмотреть множество слоев данных и найти то, что я ищу, но я пытаюсь выяснить, как получить доступ к этим данным напрямую.
Я не совсем уверен, куда идти дальше. Если кто-нибудь может дать мне несколько советов, я был бы очень признателен. Мое знакомство с HTML очень низкое, я пытаюсь больше узнать об этом и понять, но из того, что я смог собрать, просмотрев страницу, было то, что данные хранились внутри класса «TableBase-bodyTr», поэтому я указал там узел.
Ответ №1:
В форматировании таблицы есть что-то странное, что вызывает ошибку html_table()
. Не совсем уверен, как это исправить.
Вот альтернатива очистке содержимого строк и последующему созданию фрейма данных.
library(rvest)
page <- read_html("https://www.cbssports.com/fantasy/football/stats/QB/2020/season/projections/ppr/")
#find the rows of the table
rows<-page%>% html_nodes('tr')
#the first 2 rows are the header information skipping those
#get the playname (both short and long verision)
playername <- rows[-c(1, 2)] %>% html_nodes('td span span a') %>% html_text() %>% trimws()
playername <- matrix(playername, ncol=2, byrow=TRUE)
#get the team and position
position <- rows[-c(1, 2)] %>% html_nodes('span.CellPlayerName-position') %>% html_text() %>% trimws()
team <- rows[-c(1, 2)] %>% html_nodes('span.CellPlayerName-team') %>% html_text() %>% trimws()
#get the stats from the table
cols <- rows[-c(1, 2)] %>% html_nodes('td') %>% html_text() %>% trimws()
stats <-matrix(cols, ncol=16, byrow=TRUE)
#make the final answer
answer <- data.frame(playername, position, team, stats[, -1])
#still need to rename the columns
statnames<-c("Name_s", "Name_l", "position", "team", 'GP', 'ATT', 'CMP', 'YDS', 'YDS/G', "TD", 'INT', 'RATE', 'ATT', 'YDS', 'AVG', 'TD', 'FL', 'FPTS', "FPPG")
names(answer) <- statnames
Это даст вам 95%, я не пытался автоматически извлекать имена столбцов с веб-страницы. Было проще вручную копировать и вставлять и назначать имена столбцов.
Комментарии:
1. Спасибо! Я просматриваю код, пытаясь понять все это. Все еще поступают какие-то странные данные, нужно изучить их дальше. Спасибо за ваши усилия, я действительно ценю это. HTML действительно сбивает меня с толку, я не уверен, на какой узел смотреть, а на какой нет.
2. @MSCRN, Да, эта страница была непростой, надеюсь, комментарии выше дают достаточно указаний, чтобы сделать окончательный вывод.