Как я могу очистить таблицу с сайта в вопросе

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

Вот мой код:

url <- "https://data.cms.gov/provider-characteristics/medicare-provider-supplier-enrollment/medicare-fee-for-service-public-provider-enrollment/api-docs"

html <- rvest::read_html(url)
> html |> rvest::html_node(".table")
{xml_missing}
<NA>

И

> html |>
 rvest::html_node(xpath = "/html/body/div/div/div/div/div/div/div[2]/div[2]/div/div/table/tbody")
{xml_missing}
<NA>

И

html |>
  rvest::html_node("tbody")

Вывод показал, что необходимо включить JavaScript. Первый ответ работает для текущего набора данных, а второй ответ, который я опубликовал, работает для большинства дистрибутивов, в которых в выходных данных присутствуют accessURL и заголовок.

Что показывает вывод html? Появляется ли сообщение: «Для запуска этого приложения необходимо включить JavaScript»? Если да, то вы можете рассмотреть возможность использования RSelenium.

LMc 22.02.2024 17:02
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
1
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

К сожалению, этот подход не сработает. Таблицы на странице, которую вы просматриваете, генерируются с помощью JavaScript. Вызов rvest::read_html(url) получит статический контент на этой странице, но не выполнит какой-либо (динамический) JavaScript.

Но за сайтом стоит API, поэтому вы можете получать данные непосредственно оттуда. Например:

library(httr)

params = list(
  `path` = "/provider-characteristics/medicare-provider-supplier-enrollment/medicare-fee-for-service-public-provider-enrollment"
)

res <- httr::GET(url = "https://data.cms.gov/data-api/v1/slug", query = params)

cat(content(res, as = "text", encoding = "UTF-8"))

В качестве альтернативы вы можете использовать что-то вроде {RSelenium}, чтобы оценить JavaScript, а затем очистить полностью отрисованную страницу.

Я также смог получить большую часть того, что хотел, выполнив следующие действия:

url <- "https://data.cms.gov/data.json"

data_sets <- httr2::request(url) |>
  httr2::req_perform() |>
  httr2::resp_body_json(check_type = FALSE, simplifyVector = TRUE)

data_tbl <- data_sets$dataset |>
  dplyr::tibble() |>
  dplyr::select(title, modified, keyword, description, contactPoint, identifier) |>
  tidyr::unnest(cols = c(keyword, contactPoint)) |>
  dplyr::select(-`@type`) |>
  dplyr::mutate(hasEmail = stringr::str_remove(hasEmail, "mailto:"))

data_distribtution <- function(.data){
  df <- .data
  
  dplyr::tibble(data = df[["dataset"]][["distribution"]]) |>
    dplyr::mutate(cnm = purrr::map(data, \(x) names(x))) |>
    dplyr::mutate(title_in_col = purrr::map(cnm, \(x) "title" %in% x) |> unlist()) |>
    dplyr::mutate(accessURL_in_col = purrr::map(cnm, \(x) "accessURL" %in% x) |> unlist()) |>
    dplyr::filter(title_in_col == TRUE & accessURL_in_col == TRUE) |>
    dplyr::select(data) |>
    dplyr::mutate(data = purrr::map(
      data, \(x) x |>
        dplyr::select(title, modified, temporal, accessURL, 
                      downloadURL, mediaType) |>
        dplyr::mutate(data_link = dplyr::coalesce(accessURL, downloadURL)) |>
        dplyr::mutate(mediaType = ifelse(is.na(mediaType), "api", mediaType)) |>
        dplyr::mutate(modified = as.Date(modified)) |>
        dplyr::select(-accessURL, -downloadURL) |>
        dplyr::arrange(dplyr::desc(modified), mediaType)
    )) |>
    tidyr::unnest(cols = c(data))
}

Пример вывода

> data_distribtution(.data = data_sets) |>
+   head(1) |>
+   dplyr::glimpse()
Rows: 1
Columns: 5
$ title     <chr> "Accountable Care Organization Participants : 2024-01-24"
$ modified  <date> 2024-01-29
$ temporal  <chr> "2024-01-01/2024-12-31"
$ mediaType <chr> "api"
$ data_link <chr> "https://data.cms.gov/data-api/v1/dataset/9767cb68-8ea9-4f0b-8179-9431abc89f1…

Другие вопросы по теме