Я собираю статьи с разных сайтов с помощью 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-узлы с тегами были неповрежденными, поскольку я хотел бы выполнить дальнейшую обработку узлов верхнего уровня (например, для извлечения заголовков). Спасибо большое.
@supputuri спасибо - это работает! Однако у меня есть продолжение, есть ли способ структурировать xpath без ссылки на body
или любой другой тег, кроме a
? еще раз спасибо!
Проверьте первый вариант в моем ответе.
Вариант 1: Использование следующего брата::
//a/following-sibling::[[text()]]
Вариант 2: Использование родителя со следующим ::
//a/following::[[text()]][parent::body]
Дайте мне знать, как это происходит с вариантом 1.
В основном это работает, я получаю три компонента (ожидая 2, как в посте) с приведенным выше примером. По какой-то причине блок <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><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>
Считаете ли вы, что пара с другим ребенком разрешена? Нет, это не так. Вот почему вложенный <p>
будет отображаться как еще один узел.
Как насчет
//a/following::*[*[text()]][parent::body]
?