R: Webscraping: содержимое XML не похоже на XML: использование htmlParse

#html #r #xml #web-scraping #html-parsing

#HTML #r #xml #веб-очистка #html-синтаксический анализ

Вопрос:

Я пытаюсь обрабатывать данные в Интернете на протяжении многих лет (представленные разными веб-страницами). Мои данные за 2019 год работают точно так, как я хочу, но я получаю сообщение об ошибке, когда пытаюсь подготовить свои данные за 2016 год к моим данным за 2019 год.

 url19 <- 'https://www.pro-football-reference.com/draft/2019-combine.htm'

get_pfr_HTML_file19 <- GET(url19)

combine.parsed19 <- htmlParse(get_pfr_HTML_file19)

page.tables19 <- readHTMLTable(combine.parsed19, stringsAsFactors = FALSE)

data19 <- data.frame(page.tables19[1])

cleanData19 <- data19[!rowSums(data19 == "")> 0,]

cleanData19 <- filter(cleanData19, cleanData19$combine.Pos == 'CB' | cleanData19$combine.Pos == 'S')
  

cleanData19 — это именно то, что я хочу, но когда я пытаюсь запустить его с данными 2016 года, я получаю сообщение об ошибке: содержимое XML не похоже на XML: «

 url16 <- 'https://www.pro-football-reference.com/draft/2016-combine.htm'

get_pfr_HTML_file16 <- GET(url16)

combine.parsed16 <- htmlParse(get_pfr_HTML_file16)

page.tables16 <- readHTMLTable(combine.parsed16, stringsAsFactors = FALSE)

data16 <- data.frame(page.tables16[1])

cleanData16 <- data16[!rowSums(data16 == "")> 0,]

cleanData16 <- filter(cleanData16, cleanData16$combine.Pos == 'CB' | cleanData16$combine.Pos == 'S')
  

Я получаю сообщение об ошибке при попытке запустить combine.parsed16 <- htmlParse(get_pfr_HTML_file16)

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

1. Обязательно перечислите все неосновные R-пакеты, которые вы используете. Похоже, может быть, вы расчесываете httr и XML ? Попробуйте просто передать URL напрямую htmlParse , а не использовать GET , если вы хотите использовать GET , тогда вам лучше использовать xml2 пакет вместо работы с данными.

Ответ №1:

Я не уверен на 100% в вашем желаемом результате, вы не включили свои библиотечные вызовы в свой пример. В любом случае, используя этот код, вы можете получить таблицу

 library(rvest)
library(dplyr)

url <- 'https://www.pro-football-reference.com/draft/2016-combine.htm'

read_html(url) %>% 
  html_nodes(".stats_table") %>% 
  html_table() %>% 
  as.data.frame() %>% 
  filter(Pos == 'CB' | Pos == "S")
  

Несколько лет сразу:

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

years <- 2013:2019
urls <- paste0(
  'https://www.pro-football-reference.com/draft/',
  years,
  '-combine.htm')

map(
  urls,
  ~read_html(.x) %>% 
    html_nodes(".stats_table") %>% 
    html_table() %>% 
    as.data.frame()
) %>%
  set_names(years) %>% 
  bind_rows(.id = "year") %>% 
  filter(Pos == 'CB' | Pos == "S")