
当Scrapy使用冗长CSS选择器无法提取元素时,往往因路径过度具体或含不存在的类名;应聚焦目标元素的核心特征(如span.elementor-heading-title),用简洁、语义化的选择器直接定位。
当scrapy使用css选择器返回空列表(如['listlibelles': [])时,问题通常不在于网页未加载或数据不存在,而在于选择器路径过于冗长、耦合了动态/非稳定属性(如`elementor-44463`、`dce-elementor-rendering-id-1`等随机id或已失效的父级类),导致匹配失败。
要可靠提取目标文本(如“Accompagnement”和“Validation des Acquis de l'Expérience - Livret 2”),应遵循最小必要原则:只保留稳定、语义明确且唯一标识目标元素的CSS类。
✅ 正确做法:
直接利用 <span class="elementor-heading-title elementor-size-default"></span> 中最具辨识度且稳定的类——elementor-heading-title。该类在HTML结构中重复出现且专用于标题内容,是理想的锚点。
import scrapy
class MonAvenirProSpider(scrapy.Spider):
name = "monavenirpro" # 注意:此处是赋值,不是类型注解(原代码中误用冒号)
start_urls = ["https://monavenirpro-hdf.fr/formations/"]
def parse(self, response):
# ✅ 简洁高效:仅依赖稳定类名
libelles = response.css("span.elementor-heading-title::text").getall()
# 可选:过滤空字符串,提升健壮性
libelles = [text.strip() for text in libelles if text.strip()]
yield {"listlibelles": libelles}
? 关键说明与注意事项:
-
response.css(...).getall()返回所有匹配文本的列表(推荐用于多结果);get()则只取第一个(适合单例)。 - 原选择器中包含
div[class='elementor elementor-44463 dce-elementor-rendering-id-1']—— 这类带数字ID的类名通常由页面构建工具动态生成,每次部署可能变化,绝对不可作为选择器依据。 - 不必逐层写全父容器(如
div > div > div > span),CSS选择器天然支持后代关系,span.elementor-heading-title已能跨层级精准捕获所有匹配项。 - 若需进一步区分(如仅取第二个标题),可用伪类:
span.elementor-heading-title:nth-of-type(2)::text,但应优先通过语义(如相邻兄弟节点、data-*属性)增强可维护性。
? 总结:Scrapy中CSS选择器的生命力在于稳定性与简洁性。放弃“复制完整XPath/CSS路径”的惯性思维,转而分析HTML的语义结构,选取最短、最鲁棒的选择器,是解决“无结果”问题的根本方法。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











