如何仅从父 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
包,您实际上可以编辑节点(即删除节点元素)。
我有一个代码:
<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
包,您实际上可以编辑节点(即删除节点元素)。