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()
关键修改说明
- 新的XPath
following-sibling::*[self::ol or self::h2[contains(@id,'best')]][1][self::ol]/li的逻辑:- 先找当前h2之后的所有兄弟节点,筛选出ol或者id含"best"的h2
- 取筛选后的第一个节点
- 只有当这个节点是ol时,才取里面的li——这样就保证了不会抓取到下一个目标h2之后的内容,也不会把不属于当前h2的ol算进来
这样修改后,就能精准获取每个id含"best"的h2对应的后续列表项,不会出现跨h2抓取或重复内容的问题。
内容的提问来源于stack exchange,提问作者Ujjawal Bhandari
相关产品推荐
相关产品推荐

