Как вы находите текстовые узлы верхнего уровня без дублирования - PullRequest
0 голосов
/ 28 мая 2019

Я собираю статьи с разных сайтов, используя 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>

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

"//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-узлы не содержали тегов, поскольку я хотел бы выполнить дальнейшую обработку на узлах верхнего уровня (например, для извлечения заголовков). Большое спасибо.

1 Ответ

0 голосов
/ 28 мая 2019

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

// / после-родственный :: [ [текст ()]]

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

// / после :: [ [текст ()]] [родитель :: тело]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...