Использование xpath в rvest для очистки содержимого между двумя заголовками h5? - PullRequest
0 голосов
/ 29 мая 2020

Я в процессе извлечения содержимого из локальных html файлов с помощью rvest. Я хотел бы выделить определенный сегмент контента между двумя заголовками h5, единственная «определяющая» деталь - это текстовый заголовок начального заголовка h5. Проблема в том, что документы различаются по заголовкам - как идентификаторы, так и текстовое содержимое могут быть разными - единственным исключением является текстовый заголовок «Подробности», который меня интересует. Пожалуйста, посмотрите пример структуры документа:

<div id=”document”>
<h3>Title of the document</h3>
<h4 id=”id11111”>Focus of the document</h4>
<p>This document focuses on…</p>
<p>And also…</p>
<h5 id=”id22222”> 1. Introduction </h5>
<p>Text here.</p>
<h6 id=”33333”> 1.1 Preliminary introduction </h6>
<p> Text here. </p>
<h5 id=”id44444”> 2. Details </h5>
<p>Text here.</p>
<h6 id=”id55555”> 2.1 Details about A </h6>
<p> Text here. </p>
<h6 id=”id66666”> 2.2 Details about B </h6>
<p> Text here. </p>
<h5 id=”id77777”> 3. Timeline </h5>
<p>Text here.</p>
<h6 id=”id88888”> 3.1 Timeline A </h5>
<p>Text here.</p>
</div>

Из предыдущего примера я хотел бы извлечь только и только контент из тега h5 с id44444, текстовым заголовком «2. Details» до следующего заголовка h5 (h5 id 77777, 3, Временная шкала).

Мне удалось определить, что мой скребок начался с желаемого тега h5 (см. Пример ниже), используя contains и following-sibling :: *, но он возвращает всех братьев и сестер до конца документ, тогда как моя цель - остановить возврат к следующему заголовку h5.

Я не понял, как использовать «previous-sibling», потому что следующий тег h5 не имеет стандартного идентификатора, xpath или текстовое содержимое и порядок заголовков нестандартный. Заголовки h5 могут появляться в разном порядке.

#loading rvest
library('rvest')


files <- list.files(”C:/htmldocuments”)

#performing the scrape
scraping <- sapply(files, function (x)
read_html(x, encoding = "utf-8") %>%
html_nodes(xpath = '//h5[contains(., ”Details”)]/following-sibling::*') %>%
html_text())

Это возвращает результаты, которые начинаются в правильном месте, но как их можно остановить на первом последующем теге h5 после тега h5 в «Details»? Идентификатор и название следующего тега h5 различаются и поэтому неизвестны.

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

1 Ответ

0 голосов
/ 29 мая 2020

Вы можете использовать следующее выражение XPath:

//p[preceding::*[1][contains(.,"Details")]]

Это выберет все p элементы, которым предшествует элемент заголовка, содержащий слово «Подробности».

Вывод : 3 узла

Nodes

Если вам нужно сохранить заголовки, вы можете использовать:

//*[preceding::*[1][contains(.,"Details")] or contains(text(),"Details")]

Вывод: 6 узлов

...