You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用rvest与XPath提取当前节点不含子节点的文本及指定地址

我来帮你搞定这个问题!用rvest结合XPath确实能精准提取你要的文本,避免把其他子节点的内容带进来。下面结合你提到的最小工作场景,给你分步讲解和代码示例:

先明确目标HTML结构

假设你的目标HTML结构大概是这样(对应你说的嵌套div,包含需要忽略的子标签和<br>分隔的文本):

<div class="location-info">
  <h4>Main Street Branch</h4>
  <span class="tag">Local Shop</span>
  <br>
  Hillsgrove, Missouri 13231-1123
  <div class="extra">Open 24/7</div>
</div>

方案1:仅提取地址文本(最理想状态)

想要精准拿到<br>之后的地址,我们可以用XPath定位到<br>节点,然后取它的第一个兄弟文本节点——这就是你要的地址。代码如下:

library(rvest)

# 加载并解析HTML(如果是从网页抓取,替换成read_html("你的URL"))
html_content <- '
<div class="location-info">
  <h4>Main Street Branch</h4>
  <span class="tag">Local Shop</span>
  <br>
  Hillsgrove, Missouri 13231-1123
  <div class="extra">Open 24/7</div>
</div>
'
page <- read_html(html_content)

# 提取地址文本
address <- page %>%
  html_element(xpath = "//div[@class='location-info']/br/following-sibling::text()[1]") %>%
  html_text(trim = TRUE)

print(address)
# 输出:"Hillsgrove, Missouri 13231-1123"

XPath逻辑解释:

  • //div[@class='location-info']:定位到目标div(根据你的实际class替换)
  • /br/following-sibling::text()[1]:找到div下的<br>节点,然后取它之后的第一个直接文本节点(就是地址)
  • trim = TRUE:自动去掉文本前后的换行、空格,得到干净的内容

方案2:提取副标题+地址(排除其他子节点)

如果需要把<br>之前的副标题(比如示例里的"Main Street Branch")和地址一起提取,同时忽略其他子标签(比如<span><div class="extra">),可以这样做:

# 获取div下所有非空白的直接文本节点,合并成结果
subtitle_address <- page %>%
  html_elements(xpath = "//div[@class='location-info']/text()[normalize-space() != '']") %>%
  html_text(trim = TRUE) %>%
  paste(collapse = " ")

print(subtitle_address)
# 输出:"Main Street Branch Hillsgrove, Missouri 13231-1123"

这里的关键:

  • //div[@class='location-info']/text():只取div的直接子文本节点,不会包含子标签(比如h4、span里的文本)
  • normalize-space() != '':过滤掉HTML里的换行、空白等无效文本节点
  • 最后用paste把多个文本节点合并成一段

为什么直接用html_text()不行?

如果你直接对div用html_text(),它会把div下所有子元素的文本都拼接起来,比如会拿到"Main Street Branch Local Shop Hillsgrove, Missouri 13231-1123 Open 24/7",这显然不是你要的结果。而用XPath精准定位直接文本节点,就能避开这些多余内容。

内容的提问来源于stack exchange,提问作者Tyler Rinker

火山引擎 最新活动