2

我有一个代码:

<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)

4

2 回答 2

2

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

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

或者,您可以使用以下内容选择所有“非空”字符串

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())")
于 2016-08-31T07:08:09.573 回答
1

这将抓取<p>来自子节点的所有文本(这意味着它不会包含来自不是“文本发射器”的子节点的文本:

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"

不幸的是,这相当“有损”(你会失去<b>,<span>等),但这个或 @Floo0 的(也可能有损)解决方案可能对你来说足够有效。

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

于 2016-08-31T11:48:13.590 回答