Использование rvest для создания базы данных из нескольких файлов XML

Использование R для извлечения соответствующих данных из нескольких онлайн-файлов XML для создания базы данных

Я только начал изучать R для анализа текста. Вот что я пытаюсь сделать: я пытаюсь использовать rvest in r для создания базы данных CSV с резюме счетов 116-го Конгресса из онлайн-файлов XML. В базе данных должно быть два столбца:

  1. Название законопроекта.
  2. Сводный текст законопроекта.

Источник веб-сайта: https://www.govinfo.gov/bulkdata/BILLSUM/116/hr

У меня проблема

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

Я пробовал следующий код, но не уверен, как именно применить их к моей конкретной проблеме. Кроме того, я получил отчет об ошибке моего кода. Пожалуйста, посмотрите мой код ниже. Спасибо за любую помощь заранее!

library(rvest)    
library(tidyverse)
library(purrr)
html_source <- "https://www.govinfo.gov/bulkdata/BILLSUM/116/hr?page="


map_df(1:997, function(i) {  

  cat(".")

  pg <- read_html(sprintf(html_source, i))

  data.frame(title = html_text(html_nodes(pg, "title")),
             bill_text %>% html_node("summary-text") %>% html_text(),
             stringsAsFactors = FALSE) 

}) -> Bills 

Ошибка в open.connection (x, "rb"): ошибка HTTP 406.


person w304439474    schedule 17.09.2019    source источник


Ответы (1)


Внизу этой страницы находится ссылка на zip-файл со всеми файлами XML, поэтому вместо очистки каждого из них по отдельности (что станет обременительным с помощью рекомендуемая задержка сканирования 10 секунд) вы можете просто загрузить zip-файл и проанализировать файлы XML с помощью xml2 (rvest для HTML):

library(xml2)
library(purrr)

local_dir <- "~/Downloads/BILLSUM-116-hr"
local_zip <- paste0(local_dir, '.zip')

download.file("https://www.govinfo.gov/bulkdata/BILLSUM/116/hr/BILLSUM-116-hr.zip", local_zip)
# returns vector of paths to unzipped files
xml_files <- unzip(local_zip, exdir = local_dir)

bills <- xml_files %>%
    map(read_xml) %>% 
    map_dfr(~list(
        # note xml2 functions only take XPath selectors, not CSS ones
        title = xml_find_first(.x, '//title') %>% xml_text(),
        summary = xml_find_first(.x, '//summary-text') %>% xml_text()
    ))

bills
#> # A tibble: 1,367 x 2
#>    title                               summary                             
#>    <chr>                               <chr>                               
#>  1 For the relief of certain aliens w… Provides for the relief of certain …
#>  2 "To designate the facility of the … "Designates the facility of the Uni…
#>  3 Consolidated Appropriations Act, 2… <p><b>Consolidated Appropriations A…
#>  4 Financial Institution Customer Pro… <p><strong>Financial Institution Cu…
#>  5 Zero-Baseline Budget Act of 2019    <p><b>Zero-Baseline Budget Act of 2…
#>  6 Agriculture, Rural Development, Fo… "<p><b>Highlights: </b></p> <p>This…
#>  7 SAFETI Act                          <p><strong>Security for the Adminis…
#>  8 Buy a Brick, Build the Wall Act of… <p><b>Buy a Brick, Build the Wall A…
#>  9 Inspector General Access Act of 20… <p><strong>Inspector General Access…
#> 10 Federal CIO Authorization Act of 2… <p><b>Federal CIO Authorization Act…
#> # … with 1,357 more rows

Столбец summary отформатирован в формате HTML, но в целом он уже довольно чистый.

person alistaire    schedule 17.09.2019
comment
Привет, Алистер, извиняюсь за опоздание. Большое спасибо за Вашу помощь. Работает отлично! Кроме того, я сам пытался разобраться, что очень похоже на ваши коды. Не могли бы вы задать два следующих вопроса с вашими кодами? - person w304439474; 24.09.2019
comment
1) Я не видел вашего определения .x, значит ли оно относится ко всем файлам, извлеченным с веб-сайта? Это по умолчанию? 2) Как насчет разницы между селекторами XPath и CSS? Еще раз большое спасибо за вашу помощь! - person w304439474; 24.09.2019
comment
1. ~ .x - это сокращенное обозначение мурлыканья анонимной функции, которое также может быть написано function(x) x . В этом случае он выполняет итерацию по читаемым XML-файлам, поэтому .x является одним файлом. - person alistaire; 28.09.2019
comment
2. В XML вам нужно использовать XPath для выбора узлов, которые вы заботиться о. С HTML (через rvest) вы можете использовать XPath или CSS-селекторы (которые не так эффективны, но легче писать). В этом случае вы знаете точное имя узла, поэтому вы можете использовать //{node name} для поиска в любом месте DOM узлов с именем {node name}. - person alistaire; 28.09.2019
comment
Привет, Алистер, большое спасибо за ответы. Это очень помогает! - person w304439474; 29.09.2019