如何使用XPath提取div.entry内第一个hr标签之前的全部文本
错误原因
你之前的写法存在两个问题:
ancestor::div[@class="entry"]/text()只会提取div节点的直接子文本节点,而你需要的文本都包裹在p等子节点内部,不会被匹配到- 没有限定只取第一个hr之前的内容,会匹配整个div下的文本,不符合筛选要求
正确写法
场景1:XPath 1.0 环境(多数爬虫、旧解析器适用)
如果需要分别拿到每个文本节点,写法如下:
//div[@class="entry"]/hr[1]/preceding-sibling::*//text()
如果还要包含div下第一个hr之前的无标签直接文本,修改为:
//div[@class="entry"]/hr[1]/preceding-sibling::node()//text()
场景2:XPath 2.0 及以上环境
如果需要直接拼接所有符合条件的文本为一个字符串,写法如下:
string-join(//div[@class="entry"]/hr[1]/preceding-sibling::*//text(), ' ')
逻辑说明
上述写法的核心是使用preceding-sibling轴,先定位到class为entry的div下的第一个hr标签,再匹配该hr之前的所有同级节点,最后提取这些节点下全层级的文本内容,刚好匹配你给出的示例需求,可正确获取到some text、some text2、some text3、some text4四段内容。
内容的提问来源于stack exchange,提问作者rajsx
相关产品推荐
相关产品推荐

