library(stringi)
library(rvest)
library(tidyverse)
Кэшируйте страницу, поскольку она большая и загружается очень медленно:
if (!file.exists("~/Data/forso.html")) {
read_html(
"https://gallica.bnf.fr/ark:/12148/bpt6k5619759j.texteBrut"
) -> pg
write_lines(as.character(pg), "~/Data/forso.html")
}
Читайте ее в виде строк.Обычно это действительно плохая идея для работы с HTML, но она лучше для этого процесса, поскольку XPath, необходимый для работы с текстом между последовательностями тегов, грубоват и медленен (даже просто находить элементы <hr>
было довольномедленно используя html_nodes()
:
doc <- read_lines("~/Data/forso.html")
Теперь найдите все элементы <hr>
, игнорируя первые два, так как они находятся после раздела ввода / метаданных:
pos <- which(doc == "<hr>")[-(1:2)]
Создать началоИндексный / конечный маркер позиционирует текст:
starts <- head(pos, -1)
ends <- tail(pos, -1)
Перебирает начальную / конечную позиции, извлекает текст, разбивает его на строки и создает фрейм данных:
map_df(seq_along(starts), ~{
start <- starts[.x]
end <- ends[.x]
data_frame(
pg = .x,
txt = read_html(paste0(doc[start:end], collapse="\n")) %>%
html_children() %>%
html_text() %>%
stri_split_lines() %>%
flatten_chr() %>%
list()
)
}) -> xdf
Возьмитеlook:
xdf
## # A tibble: 542 x 2
## pg txt
## <int> <list>
## 1 1 <chr [4]>
## 2 2 <chr [2]>
## 3 3 <chr [13]>
## 4 4 <chr [1]>
## 5 5 <chr [35]>
## 6 6 <chr [19]>
## 7 7 <chr [22]>
## 8 8 <chr [18]>
## 9 9 <chr [16]>
## 10 10 <chr [36]>
## # ... with 532 more rows
Другой взгляд:
glimpse(xdf)
## Observations: 542
## Variables: 2
## $ pg <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, ...
## $ txt <list> [<"OEUVRES COMPLETES ", "DE MOLIERE ", "TOMI: III ", "">, <"PARIS. — I1IP. SIMON RAÇON ET COUP., RUE D...
Еще один:
str(head(xdf))
## Classes 'tbl_df', 'tbl' and 'data.frame': 6 obs. of 2 variables:
## $ pg : int 1 2 3 4 5 6
## $ txt:List of 6
## ..$ : chr "OEUVRES COMPLETES " "DE MOLIERE " "TOMI: III " ""
## ..$ : chr "PARIS. — I1IP. SIMON RAÇON ET COUP., RUE D'ERFURTH, 1. " ""
## ..$ : chr "OEUVRES COMPLETES " "DE MOLIERE " "NOUVELLE ÉDITION " "ACe-OJIPAfi NEES DE NOTES TIRÉES DE TOUS L, E S COMMENTATEURS AVEC DES REMARQUES NOUVELLES " ...
## ..$ : chr ""
## ..$ : chr "OEUVRES " "COMPLÈTES " "DE MOLIÈRE " "MONSIEUR DE POURCEAUGNAC' " ...
## ..$ : chr "MONSIEUR DE POURCEAUGNAC. " "MATASSINS dansants. DEUX AVOCATS chantants. DEUX PROCUREURS dansants. DEUX SERGENTS dansants. TROUPE DE MASQUES"| __truncated__ "La scène est à Paris. " "ACTE PREMIER " ...
Это также захватывает пустые строки, но я понятия не имею, что вам нужноза пределами того, что вы описали.