Как сохранить перенос строки при получении текста с помощью rvest

Я извлекаю текст судебных решений с веб-сайта и хочу сохранить разрывы строк (которые мне понадобятся позже для анализа текста). К сожалению, rvest's html_text удаляет разрывы строк и, например, два слова, изначально разделенные \ n, просто объединяются. Например, "GerichtAsylgerichtshof" на самом деле должно быть "Gericht \ nAsylgerichtshof".

library(rvest, quietly = T, warn.conflicts = F)
library(tidyverse, quietly = T, warn.conflicts = F)

test_url <- "https://www.ris.bka.gv.at//Dokumente/AsylGH/ASYLGHT_20131125_E5_408_113_1_2009_00/ASYLGHT_20131125_E5_408_113_1_2009_00.html"

test_url_parsed <- test_url %>% 
  xml2::read_html() %>% 
  rvest::html_nodes(".contentBlock") 
test_url_parsed
#> {xml_nodeset (5)}
#> [1] <div class="contentBlock">\n<h1 class="Titel AlignJustify">Gericht</h1>\n ...
#> [2] <div class="contentBlock">\n<h1 class="Titel AlignJustify">Entscheidungsd ...
#> [3] <div class="contentBlock">\n<h1 class="Titel AlignJustify">Geschäftszahl< ...
#> [4] <div class="contentBlock">\n<h1 class="Titel AlignJustify">Spruch</h1>\n< ...
#> [5] <div class="contentBlock">\n<h1 class="Titel AlignJustify">Text</h1>\n<p  ...

#linebreak gets lost
x <- test_url_parsed %>% 
  html_text()
x[1]
#> [1] "GerichtAsylgerichtshof"

Создано 14 мая 2020 г. пакетом REPEX (v0.3.0)

Я нашел несколько многообещающих способов подойти к этому вопросу, но, к сожалению, не смог ответить на свой конкретный вопрос. См., Например, здесь (заменяет html ‹br> с \ n) и обсуждение здесь на github.

Обратите внимание, что разрывы строк \ n появляются не только в заголовках (например, ‹h1>), но и во всем тексте (также‹ p>).

Большое спасибо.


person zoowalk    schedule 13.05.2020    source источник


Ответы (1)


Проблема в том, что вы не переходите на самый глубокий уровень дерева перед вызовом html_text.

Если вы запустите его как sapply в списке дочерних элементов уровня, на котором вы работаете, вы получите каждую строку как элемент вектора. Например узел 1:

html_children(test_url_parsed[[1]]) %>% html_text
[1] "Gericht"         "Asylgerichtshof"

Затем вам необходимо склеить детали вместе:

html_children(test_url_parsed[[1]]) %>% html_text %>% paste0(collapse = "\n")
[1] "Gericht\nAsylgerichtshof"

Следующий код выполняет операцию для всех узлов contentBlock узлов и их дочерних узлов:

> resPaste <- lapply(sapply(FUN = html_children, X = test_url_parsed), function(node) paste0(html_text(node), collapse = "\n"))

Это даст желаемый результат:

> str(resPaste)
List of 5
 $ : chr "Gericht\nAsylgerichtshof"
 $ : chr "Entscheidungsdatum\n25.11.2013"
 $ : chr "Geschäftszahl\nE5 408113-1/2009"
 $ : chr "Spruch\nZl. E5 408.113-1/2009/13E\n\nIM NAMEN DER REPUBLIK!\n\nDer Asylgerichtshof hat durch die Richterin Dr. "| __truncated__
 $ : chr "Text\nEntscheidungsgründe:\n\nI. Verfahrensgang und Sachverhalt:\n\nI.1.1. Der Beschwerdeführer, ein irakischer"| __truncated__
person Grada Gukovic    schedule 13.05.2020
comment
извините за то, что снова доставил вам ошибку. Мне пришлось изменить свой узел на test_url_parsed ‹- test_url%›% xml2 :: read_html ()% ›% rvest :: html_nodes (body) Но похоже, предложенный вами подход больше не работает. Любая идея? Если хотите, я могу задать новый вопрос. - person zoowalk; 20.05.2020