.text是只读属性,返回标签及其子标签的拼接文本,但遇注释、cdata或多文本节点时可能返回none;.get_text()是方法,递归提取所有文本节点,支持separator、strip等清洗参数,更稳定灵活。

直接用 .get_text() 或 ::text 就能拿到纯文本,但选错方法或忽略上下文,结果会是空、乱码、或者把整个 HTML 当字符串吐出来。
BeautifulSoup 中 .text 和 .get_text() 的区别在哪
.text 是只读属性,返回当前标签及其所有子标签的拼接文本,但遇到混合内容(比如 <strong><i></i> hello</strong>)时,它基本可用;可一旦子节点里有注释、CDATA 或多个相邻文本节点,.text 就可能返回 None。
.get_text() 是更稳的选择,它强制递归提取所有文本节点,并支持清洗参数:
-
separator=" ":用空格连接不同子标签的文本,避免粘连(如"Time:""13:45"→"Time: 13:45") -
strip=True:清除每段首尾空白,对缩进严重的 HTML 很关键 -
separator="\n":保留段落换行逻辑,适合提取文章正文
Scrapy 里为什么 css("p").get() 返回的是带标签的字符串
因为 css("p") 选中的是 <p></p> 元素对象本身,不是它的文本节点。调用 .get() 相当于序列化这个 DOM 节点,自然带上了标签。
正确做法是把 ::text 显式加到选择器末尾:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
response.css("section#talent-summary > p::text").get()→ 返回"Bob Guiney" -
response.css("section#talent-summary > p::text").getall()→ 返回["Bob Guiney", "Another Name", "Last Name"] - 注意:
::text只匹配**直接子文本节点**,不递归进子标签。例如<p><em>hi</em> there</p>中,::text只抓到" there",<em></em>里的"hi"需额外处理
遇到嵌套结构或孤立文本节点时怎么定位
HTML 中常有“文本不在子标签里,而是紧贴父标签”的情况,比如:
<p class="inner-info-blk"> <strong>Time: </strong> "13:45" </p>
这时 css("p::text") 可能返回空列表或只拿到引号,因为引号外的空白和换行也被当作文本节点。
更可靠的方式是:
- 用 XPath:
response.xpath('//p[@class="inner-info-blk"]/text()').get(),配合re_first(r'"(\d+:\d+)"')提取引号内时间 - 或先取整个
p元素,再用 Python 正则清理:re.sub(r'[\s""]+', ' ', p_elem.get()).strip() - 如果在浏览器环境,
element.innerText最省事,它天然跳过 script/style,合并空白,且自动处理文本节点位置
真正容易被忽略的是:文本节点是否“直接属于”目标标签——这决定了该用 ::text、.get_text() 还是得退回到 XPath + 正则组合拳。别默认“有标签就能直接取文本”,先 inspect 一下 DOM 树结构。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










