R webscraping, не уверен, как продолжить

#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, Да, эта страница была непростой, надеюсь, комментарии выше дают достаточно указаний, чтобы сделать окончательный вывод.