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

Scrapy使用XPath提取文本如何忽略注释获取有效正文

问题描述

需求为提取HTML节点内的正文内容,自动忽略注释部分的内容,待处理的HTML结构如下:

<td>
<!--
  <i class="fab fa-youtube" aria-hidden="true" style="color: #f00;"></i>                                      
-->
main content
</td>

当前编写的Scrapy爬虫提取逻辑如下:

'name': row.xpath('td[2]/text()').get()

运行上述代码仅能获取到\n、\t类空白字符,无法得到目标正文内容。

问题原因

/text()语法只会匹配当前节点下的直接文本节点,且get()方法仅返回匹配到的第一个结果。在上述HTML结构中,<td>标签后、注释节点前的第一段内容就是换行、缩进组成的空白字符,因此直接取第一个文本节点只能拿到无意义的空白;同时注释节点属于单独的注释类型节点,不属于普通文本节点范畴,不会被/text()直接匹配。

解决方案

提供两种可直接运行的实现方式,均会自动忽略注释内容、过滤无意义空白字符:

  • 方案1:纯XPath过滤实现,写法简洁
    直接通过XPath筛选所有非注释下的文本节点,拼接后去除首尾空白即可:
    'name': ''.join(row.xpath('td[2]//text()[not(ancestor::comment())]').getall()).strip()
    
  • 方案2:先清理注释再提取,适合复杂HTML场景
    先移除目标节点内的所有注释节点,再通过string()方法提取节点下全部拼接文本,最后做空白过滤:
    td_node = row.xpath('td[2]')
    # 移除当前节点下所有注释
    for comment in td_node.xpath('.//comment()'):
        comment.root.getparent().remove(comment.root)
    'name': td_node.xpath('string(.)').get().strip()
    

注意:提取注释节点时XPath要写.//comment()而不是//comment(),否则会匹配整个响应文档里的所有注释,造成内容误删。

内容的提问来源于stack exchange,提问作者Jimmy Xee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:51:10