必须使用::text伪元素才能精准提取p标签内纯文本,因response.css("p").get()等默认返回含标签的html字符串;::text专用于选取直接文本节点,不递归子标签,配合.get()或.getall()可高效获取干净文本。

response.css() 默认返回的是带标签的 HTML 字符串,不是纯文本。想只拿 <p></p> 里的“Bob Guiney”这种内容,必须用 ::text 伪元素,否则永远多一层包装。
为什么 .extract() 和 .get() 拿不到纯文本
这两个方法作用对象是整个匹配到的 DOM 元素节点,返回的是该节点的外层 HTML(含起始/结束标签)。即使你只选了 p,它也照常把 <p ...>Bob Guiney</p> 整个吐出来。
常见错误现象:
-
p_names = response.css("p"); name = p_names[0].get()→ 得到<p class="...">Bob Guiney</p> - 后续用
.strip()或正则去剥标签 —— 不可靠,容易漏掉嵌套<span></span>、<strong></strong>等子节点里的文字
::text 是唯一推荐的精准提取方式
Scrapy 的 CSS 选择器支持标准 CSS 伪元素,::text 专门定位元素的**直接文本子节点**(不递归进子标签),语义清晰、性能好、兼容性稳定。
实操建议:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 写法必须紧贴选择器末尾:
response.css("p::text"),不能写成response.css("p").css("::text") - 返回的是 SelectorList,要用
.get()取第一个,或.getall()取全部文本节点(注意:一个<p></p>里如果有<span>Hi</span> there,::text会分两段返回["Hi", " there"]) - 如果只想取首个非空文本,推荐
.get(default="").strip()防空值
遇到换行、空白、多段文本怎么处理
::text 会原样保留 HTML 中的空白字符(包括换行、缩进、多个空格),这在解析简历、评论、新闻摘要时特别明显。
使用场景与应对:
- 单行标题类文本:
response.css("h1::text").get(default="").strip() - 段落级多行内容:先
.getall(),再" ".join([t.strip() for t in texts]).replace("\n", " ") - 要保留原文换行(如诗歌、代码块):不用
strip(),改用text.replace("\r\n", "\n").replace("\r", "\n")
最容易被忽略的一点:如果目标标签里只有子元素、没有直接文本(比如 <p><span>Hello</span></p>),p::text 会返回空列表 —— 这时候得换路径,或者用 .xpath("./text()") 补位。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










