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

