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

Scrapy中如何从Selector提取p标签内的纯文本内容

问题:Scrapy中如何提取p标签的纯文本内容?

我用CSS选择器获取p标签,尝试提取第一个p标签的文本内容,但得到的始终是包含p标签的HTML内容。我的代码如下:

section_div = response.css('div[data-testid="talent-profile-page-talent-info"]')
p_names = section_div.css("section#talent-summary >p")
name = p_names[0].extract()

对应的p标签HTML为:

<p color="inherit" class="Text-sc-1d6qffq-0 eBczUW">Bob Guiney</p>

我知道有其他方法可以获取文本,但希望通过当前方式实现。请问是否有方法从Selector中仅提取内部文本?我需要获取的内容仅为Bob Guiney。

我曾尝试以下代码,但它仅在section内部无其他标签时生效:

p_names = section_div.css("section#talent-summary >p::text")
name = p_names[0].get()

解决方案

方法1:CSS选择器::text结合getall()拼接文本

你之前尝试的::text逻辑本身没问题,觉得它仅在无嵌套标签时生效,是因为>p::text只能获取p标签的直接文本节点。如果p标签内有嵌套子元素,改用getall()可以获取所有文本节点再拼接:

section_div = response.css('div[data-testid="talent-profile-page-talent-info"]')
p_text_nodes = section_div.css("section#talent-summary >p::text")
name = ''.join(p_text_nodes.getall()).strip()

方法2:先选中p标签Selector,再提取文本

保留你原有的“先选中p标签”的逻辑,再对选中的Selector单独提取文本:

section_div = response.css('div[data-testid="talent-profile-page-talent-info"]')
p_selector = section_div.css("section#talent-summary >p")[0]
# 单文本节点用get(),多节点用getall()拼接
name = p_selector.css('::text').get().strip()
# 有嵌套标签时用:
# name = ''.join(p_selector.css('::text').getall()).strip()

方法3:用XPath选择器获取所有后代文本

如果CSS选择器的灵活性不够,XPath的.//text()可以直接获取当前节点下所有后代的文本内容:

section_div = response.css('div[data-testid="talent-profile-page-talent-info"]')
p_selector = section_div.css("section#talent-summary >p")[0]
text_nodes = p_selector.xpath(".//text()").getall()
name = ''.join(text_nodes).strip()

补充:为什么extract()返回HTML?

extract()方法会返回Selector对应的完整HTML片段,而get()/extract_first()仅返回匹配到的第一个内容。要提取文本必须明确指定选择文本节点(::text或XPath文本选择器),否则选中的是整个元素节点,提取结果自然是元素的HTML代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:25:12