Как найти текстовые узлы верхнего уровня без дублирования

Я собираю статьи с разных сайтов с помощью R (rvest), которые часто структурированы по-разному, и хотел бы извлечь все html-узлы (без дублирования), потомки которых содержат некоторый текст, используя xpath.

Упрощая, структура может быть примерно такой (без пробелов, которые были введены для удобства чтения):

<html>
<body>
    <a name = "SomeMarker">
            <font style = "FONT-SIZE: 12pt;"><b>Sports article</b></font>
    </a>
<div>
<b>This is possibly an article heading</b>
<font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the article.</font
<font style = "FONT-SIZE: 10pt;"> It could have <i><b>interesting tags</b></i> embedded in the text</font>
</div>

<p id = "SomeId"><b>This is another article heading</b>
    <font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the second article</font>
    <p><font style = "FONT-SIZE: 10pt;"> It could have further <i><b><u>interesting tags</u></b></i> embedded in the text</font></p>
</p>

</body>
</html>

Я пробовал несколько разных xpaths, но они, похоже, всегда выбирают повторяющиеся узлы.

"//a/following::*//*[text()]"
"//a/following::*/*[normalize-space(text())]"
"//a/following::*/*[normalize-space(text())]/parent::*"

и так далее -- но все они приводят к различным перестановкам текстовых узлов

В настоящее время я получаю довольно много повторяющихся узлов, например:

[1] <div>\n<b>This is possibly an article heading</b><font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the article.</font><font style = "FONT-SIZE: 10pt;"> It could have <i><b>interes ...
[2] <font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the article.</font>
[3] <i><b>interesting tags</b></i>
[4] <p id = "SomeId"><b>This is another article heading</b><font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the second article.</font></p>\n
[5] <font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the second article.</font>
[6] <p><font style = "FONT-SIZE: 10pt;"> It could have further <i><b><u>interesting tags</u></b></i> embedded in the text</font></p>
[7] <b><u>interesting tags</u></b>

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

[1] <div><b>This is possibly an article heading</b><font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the article.</font><font style = "FONT-SIZE: 10pt;"> It could have <i><b>interesting tags</b></i> embedded in the text</font></div>
[2] <p id = "SomeId"><b>This is another article heading</b><font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the second article.</font><p><font style = "FONT-SIZE: 10pt;"> It could have further <i><b><u>interesting tags</u></b></i> embedded in the text</font></p></p>  

Я знаю xpath для простого извлечения текста - я действительно хочу, чтобы html-узлы с тегами были неповрежденными, поскольку я хотел бы выполнить дальнейшую обработку узлов верхнего уровня (например, для извлечения заголовков). Спасибо большое.

Как насчет //a/following::*[*[text()]][parent::body]?

supputuri 28.05.2019 20:59

@supputuri спасибо - это работает! Однако у меня есть продолжение, есть ли способ структурировать xpath без ссылки на body или любой другой тег, кроме a? еще раз спасибо!

rxpuser 28.05.2019 21:21

Проверьте первый вариант в моем ответе.

supputuri 28.05.2019 21:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вариант 1: Использование следующего брата::

//a/following-sibling::[[text()]]

Вариант 2: Использование родителя со следующим ::

//a/following::[[text()]][parent::body]

Дайте мне знать, как это происходит с вариантом 1.

supputuri 28.05.2019 21:46

В основном это работает, я получаю три компонента (ожидая 2, как в посте) с приведенным выше примером. По какой-то причине блок <p> разделен на два разных узла.

rxpuser 28.05.2019 22:31

Так что вместо [2] <p id = "SomeId"><b>This is another article heading</b><font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the second article.</font><p><font style = "FONT-SIZE: 10pt;"> It could have further <i><b><u>interesting tags</u></b></i> embedded in the text</font></p></p> я получаю [2] <p id = "SomeId"><b>This is another article heading</b><font style = "FONT-SIZE: 10pt;"> This is the <i>body</i> of the second article.</font></p>\n [3] <p><font style = "FONT-SIZE: 10pt;"> It could have further <i><b><u>interesting tags</u></b></i> embedded in the text</font></p>

rxpuser 28.05.2019 22:31

Считаете ли вы, что пара с другим ребенком разрешена? Нет, это не так. Вот почему вложенный <p> будет отображаться как еще один узел.

supputuri 28.05.2019 22:48

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