XPath для выбора и объединения всех текстовых узлов - PullRequest
0 голосов
/ 12 июня 2018

Я собираю данные с веб-сайта, который выглядит следующим образом:

<div class="content">
  <blockquote>
    <div>
      Do not select this.
    </div>
    How do I select only this…
    <br />
    and this…
    <br />
    and this in a single node?
  </blockquote>
</div>

Предположим, что подобный фрагмент появляется 20 раз на одной странице, и я хочу получить весь текст в <blockquote> но игнорируйте все в дочерних узлах, таких как внутренние div.

, поэтому я использую:

html %>%
  html_nodes(xpath = "//*[@class='content']/blockquote/text()[normalize-space()]")

Однако это разделяет How do I select only this…, and this…, and this in a single node? наотдельные элементы в структуре xml_nodeset.

Что мне нужно сделать, чтобы по существу объединить все эти текстовые узлы в один и вернуть те же 20 элементов (или один, если у меня был только этот пример)?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Ниже XPath можно попробовать объединить все дочерние подстроки:

"string-join(//*[@class='content']/blockquote/text()[normalize-space()], ' ')"

Выходные данные

How do I select only this… and this… and this in a single node?
0 голосов
/ 12 июня 2018

Вы можете удалить узлы с помощью CSS или XPATH с помощью функции xml_remove().

library(rvest)

text <- '<div class="content">
  <blockquote>
    <div>
      Do not select this.
    </div>
    How do I select only this…
    <br />
    and this…
    <br />
    and this in a single node?
  </blockquote>
</div>'

myhtml <- read_html(text)

#select the nodes you don't want to select
do_not_select <- myhtml %>%
    html_nodes("blockquote>div") #using css

#remove those nodes
xml_remove(do_not_select)

Вы можете удалить пробел и \ n позже

#sample result
myhtml %>%
    html_text()
[1] "\n  \n    \n    How do I select only this…\n    \n    and this…\n    \n    and this in a single node?\n  \n"
...