Один и тот же код webscrape работает на одной странице, а не на другой, используя rvest. - PullRequest
1 голос
/ 26 апреля 2020

Я построил простую очистку, чтобы получить фрейм данных с результатами черновика НФЛ за 2020 г. Я собираюсь использовать этот код для отображения результатов за несколько лет, но по какой-то причине, когда я изменяю код для очистки одной страницы для любых других год после 2020, я получаю ошибку в нижней части.

library(tidyverse)
library(rvest)
library(httr)
library(curl)

Эта статья за 2020 год работает безупречно, хотя имена столбцов в строке 1, что не так уж важно для меня, так как я могу иметь дело с это позже (упомяну, хотя в случае, если это может иметь отношение к проблеме):

x <- "https://www.pro-football-reference.com/years/2020/draft.htm"
df <- read_html(curl(x, handle = curl::new_handle("useragent" = "Mozilla/5.0"))) %>% 
        html_nodes("table") %>% 
        html_table() %>%
        as.data.frame()

ниже URL-адреса изменяется с 2020 на 2019, который является активной страницей с таблицей того же формата. По какой-то причине тот же вызов, что и выше, не работает:

x <- "https://www.pro-football-reference.com/years/2019/draft.htm"
df <- read_html(curl(x, handle = curl::new_handle("useragent" = "Mozilla/5.0"))) %>% 
        html_nodes("table") %>% 
        html_table() %>%
        as.data.frame()

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
arguments imply differing number of rows: 261, 2

1 Ответ

2 голосов
/ 27 апреля 2020

В предоставленной ссылке есть две таблицы. Существует базовый черновик (таблица 1, id = "drafts") и дополнительный черновик (таблица 2, id = "drafts_supp").

Сбой вызова as.data.frame(), поскольку он пытается объединить две таблицы, но они имеют разные столбцы как по названию, так и по номеру. Вы можете указать rvest для чтения только интересующей вас таблицы c, указав html_node() либо xpath, либо selector. Вы можете найти xpath или selector, проверив нужную вам таблицу c, щелкнув правой кнопкой мыши> осмотреть Chrome / Mozilla. Обратите внимание, что для селектора для использования идентификатора вам нужно будет использовать #drafts, а не просто drafts, а для xpath вам обычно приходится заключать текст в одинарные кавычки.

  • Это работает: html_node(xpath = '//*[@id="drafts"]')
  • Это не из-за двойных кавычек: html_node(xpath = "//*[@id="drafts"]")

Обратите внимание, что я считаю, что html_nodes("table"), используемый в вашем примере, не нужен, так как html_table() уже выбирает только таблицы.

x <- "https://www.pro-football-reference.com/years/2019/draft.htm"

raw_html <- read_html(x)

# use xpath
raw_html %>% 
  html_node(xpath = '//*[@id="drafts"]') %>%
  html_table()

# use selector
raw_html %>% 
  html_node("#drafts") %>% 
  html_table()
...