如何仅从父 HTML 节点(不包括子节点)提取文本?

How to extract text only from parent HTML node (excluding child node)?

我有一个代码:

<div class="activityBody postBody thing">
    <p>
        <a href="/forum/conversation/post/3904-22" rel="post" data-id="3904-22" class="mqPostRef">(22)</a>
        where?
    </p>
</div>

我正在使用这段代码提取文本:

html_nodes(messageNode, xpath=".//p") %>% html_text() %>% paste0(collapse="\n")

得到结果:

"(22) where?"

但我只需要 "p" 文本,不包括子节点中可能位于 "p" 内的文本。我必须得到这个文本:

"where"

有没有办法在我获取文本时排除子节点?

Mac OS 10.11.6 (15G31),RSrudio 版本 0.99.903,R 版本 3.3.1 (2016-06-21)

如果您确定您想要的文字总是排在最后,您可以使用:

doc %>% html_nodes(xpath=".//p/text()[last()]") %>% xml_text(trim = TRUE)

或者,您可以使用以下方法 select 所有 "non empty" trings

doc %>% html_nodes(xpath=".//p/text()[normalize-space()]") %>% xml_text(trim = TRUE)

有关 normalize-space() 的更多详细信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/XPath/Functions/normalize-space

第三个选项是直接通过以下方式使用 xml2 包:

doc %>% xml2::xml_find_chr(xpath="normalize-space(.//p/text())")

这将获取来自 <p> 个子节点的所有文本(这意味着它不会包含来自非 "text emitters":

的子节点的文本
library(xml2)
library(rvest)
library(purrr)

txt <- '<div class="activityBody postBody thing">
    <p>
        <a href="/forum/conversation/post/3904-22" rel="post" data-id="3904-22" class="mqPostRef">(22)</a>
        where?
    </p>
  <p>
    stays 
    <b>disappears</b>
    <a>disappears</a>
    <span>disappears</span>
    stays
  </p>
</div>'

doc <- read_xml(txt)

html_nodes(doc, xpath="//p") %>% 
  map_chr(~paste0(html_text(html_nodes(., xpath="./text()"), trim=TRUE), collapse=" "))
## [1] "where?"     "stays stays"

不幸的是,这很漂亮 "lossy"(你失去了 <b><span> 等)但是这个或@Floo0 的(也可能有损)解决方案可能对你来说足够了。

如果您使用 XML 包,您实际上可以编辑节点(即删除节点元素)。