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
相关产品推荐
相关产品推荐

