You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

rvest库XPath匹配异常:非目标h2节点的li文本被重复获取

问题修复:正确抓取指定h2后的列表项内容

原代码的问题出在following-sibling::ol[1]的XPath选择逻辑上——它只会取当前h2之后的第一个ol,不管这个ol是不是属于下一个不含"best"的h2。如果某个目标h2后面没有直接跟着ol,或者下一个ol属于其他h2,就会错误抓取不属于它的列表内容,甚至出现重复。

修复后的代码如下:

library(rvest)
library(dplyr)

url <- "https://xxxxxxxxxxx.com/blog/"
html <- read_html(url)

df <- html %>%
  html_nodes(xpath = "//h2[contains(@id,'best')]") %>%
  lapply(function(h2_node) {
    h2_text <- h2_node %>% html_text()
    # 修改XPath,限定只取当前h2到下一个目标h2之间的第一个ol
    li_nodes <- h2_node %>%
      html_nodes(xpath = "following-sibling::*[self::ol or self::h2[contains(@id,'best')]][1][self::ol]/li")
    li_texts <- li_nodes %>% html_text()
    list(h2_text = h2_text, li_texts = li_texts)
  }) %>%
  bind_rows()

关键修改说明

  • 新的XPathfollowing-sibling::*[self::ol or self::h2[contains(@id,'best')]][1][self::ol]/li的逻辑:
    1. 先找当前h2之后的所有兄弟节点,筛选出ol或者id含"best"的h2
    2. 取筛选后的第一个节点
    3. 只有当这个节点是ol时,才取里面的li——这样就保证了不会抓取到下一个目标h2之后的内容,也不会把不属于当前h2的ol算进来

这样修改后,就能精准获取每个id含"best"的h2对应的后续列表项,不会出现跨h2抓取或重复内容的问题。

内容的提问来源于stack exchange,提问作者Ujjawal Bhandari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:10:01