Scrapy CSS选择器:利用::text伪元素精准提取HTML标签内部文本

Scrapy CSS选择器:利用::text伪元素精准提取HTML标签内部文本

本文深入讲解在Scrapy中使用CSS选择器时,如何通过::text伪元素精准提取HTML标签(如

标签)的纯文本内容,而非包含标签的完整html结构。教程将提供详细代码示例,并阐述get()方法的正确用法,以及如何处理多个匹配元素,帮助开发者高效、准确地获取所需数据。

在进行网页数据抓取时,我们经常需要从HTML元素中提取其内部的纯文本内容,而不是包含标签本身的完整HTML片段。例如,对于

Bob Guiney

这样的HTML结构,我们的目标是仅仅获取“Bob Guiney”。直接使用.extract()或.get()方法在没有指定文本节点时,通常会返回包含标签的整个HTML字符串,这与我们的预期不符。Scrapy的CSS选择器提供了一个强大的伪元素::text来解决这个问题。

核心问题:获取纯文本而非HTML

当使用CSS选择器选中一个HTML元素时,例如p_names = section_div.css(“section#talent-summary > p”),如果直接对其结果调用.extract()或.get(),例如name = p_names[0].extract(),会得到整个HTML标签,如

Bob Guiney

。这是因为选择器默认选取的是元素本身,而非其内部的文本节点。

解决方案:利用::text伪元素

要精准地提取HTML标签的内部文本内容,Scrapy的CSS选择器支持使用::text伪元素。这个伪元素专门用于选取元素的直接文本子节点,忽略所有子标签。

示例代码:

立即学习“前端免费学习笔记(深入)”;

假设我们有以下HTML片段,并已通过Scrapy的response对象获取:

Bob Guiney

This is a second paragraph.

Some other text. Bold text

要从第一个

标签中提取“Bob Guiney”,我们可以这样修改选择器:

import scrapyclass MySpider(scrapy.Spider):    name = 'text_extractor'    start_urls = ['http://example.com'] # 替换为实际的URL    def parse(self, response):        # 1. 首先定位到包含目标p标签的父级div        section_div = response.css('div[data-testid="talent-profile-page-talent-info"]')        # 2. 使用::text伪元素选择p标签内的纯文本        # 这将返回一个包含所有匹配文本节点的SelectorList        p_text_selectors = section_div.css("section#talent-summary > p::text")        # 3. 获取第一个p标签的文本内容        # 使用.get()方法从Selector对象中提取字符串        first_p_name = p_text_selectors[0].get()        print(f"第一个p标签的文本内容: {first_p_name}")        # 如果p标签下有多个文本节点,或者需要获取所有p标签的文本        all_p_texts = p_text_selectors.getall()        print(f"所有p标签的文本内容列表: {all_p_texts}")        # 4. 提取第二个p标签的文本内容        if len(p_text_selectors) > 1:            second_p_text = p_text_selectors[1].get()            print(f"第二个p标签的文本内容: {second_p_text}")

代码解释:

section_div.css(“section#talent-summary > p::text”): 这里的关键是::text。它告诉Scrapy我们不仅要选择

标签,还要进一步选择这些

标签内部的直接文本节点。

p_text_selectors[0].get(): ::text选择器返回的是一个SelectorList,其中每个Selector对象都代表一个文本节点。.get()方法用于从单个Selector对象中提取其对应的字符串内容。p_text_selectors.getall(): 如果需要获取所有匹配到的文本内容,可以直接对SelectorList调用getall()方法,它会返回一个包含所有文本字符串的列表。

处理多个匹配元素

当你的选择器可能匹配到多个元素时,::text同样适用。section_div.css(“section#talent-summary > p::text”)会返回一个包含多个文本Selector对象的SelectorList。

你可以通过索引来访问特定的文本内容:

# 获取第一个p标签的文本first_p_text = p_text_selectors[0].get()# 获取第二个p标签的文本(如果存在)if len(p_text_selectors) > 1:    second_p_text = p_text_selectors[1].get()

或者,你可以遍历SelectorList来处理所有匹配到的文本:

for text_selector in p_text_selectors:    print(text_selector.get())

注意事项

::text与嵌套标签: ::text伪元素只会提取元素的直接文本子节点。如果文本被包裹在更深层的子标签中(例如

Hello World

,对p::text只会得到Hello),则需要更复杂的选择器(如xpath(‘./text()’)结合xpath(‘.//text()’)来获取所有后代文本,或者更精确的CSS选择器)。但对于本教程中的简单

Bob Guiney

情况,::text是完美的解决方案。.get()与.getall():.get():用于从SelectorList中获取第一个匹配项的字符串内容。如果SelectorList为空,则返回None。.getall():用于获取SelectorList中所有匹配项的字符串内容列表。如果SelectorList为空,则返回空列表[]。避免使用.extract()和.extract_first(): 在新版本的Scrapy中,推荐使用.get()和.getall()来替代已弃用的.extract_first()和.extract()。它们功能相同,但新方法名称更具描述性且符合PEP 8规范。

总结

通过在CSS选择器中使用::text伪元素,Scrapy能够帮助我们精确地从HTML元素中提取纯文本内容,而非包含标签的完整HTML。结合.get()或.getall()方法,开发者可以高效且准确地获取所需的数据。理解并正确运用::text是Scrapy数据抓取中的一项基本而重要的技能。

以上就是Scrapy CSS选择器:利用::text伪元素精准提取HTML标签内部文本的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1374414.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 14:08:03
下一篇 2025年12月14日 14:08:17

相关推荐

  • Golang如何打包静态资源文件 使用go embed内嵌资源方案

    使用go:embed将静态资源打包进go程序,能实现单文件部署、避免路径问题、简化依赖管理。1. 定义变量接收资源内容,类型通常为embed.fs;2. 使用//go:embed指令指定要嵌入的文件或目录;3. 编译时资源被直接打包进二进制文件;4. 通过fs.sub创建子文件系统以正确访问资源路径…

    2025年12月15日 好文分享
    000
  • Golang如何构建Markdown转换器 使用blackfriday库实践转换

    blackfriday库的核心功能是遵循commonmark规范将markdown转换为html并支持多种扩展,优势在于高性能、可定制性和广泛的功能集。1. 它支持表格、代码块高亮、任务列表等常用扩展,提升内容表现力;2. 作为go原生实现,处理速度快,适合实时渲染和大规模文档处理;3. 提供wit…

    2025年12月15日 好文分享
    000
  • Golang模块如何管理大型二进制资产 解析embed指令的资源嵌入方案

    go 1.16 引入的 embed 包提供了一种原生、简洁的方式将静态资源嵌入二进制文件。1. 使用 //go:embed 注释指令紧接变量声明,指定需嵌入的资源路径;2. 支持嵌入单个文件、整个目录或多个路径,如 //go:embed assets/*;3. 资源通过 embed.fs 类型访问,…

    2025年12月15日 好文分享
    000
  • Golang的encoding库有哪些编码方式 对比Base64与Hex的实现差异

    golang的encoding库提供多种编码方式,适用于不同场景的数据转换需求。2. base64用于将二进制数据转换为文本形式,适合在http、邮件等文本协议中传输二进制内容。3. hex将字节转为十六进制字符串,便于调试、日志记录和显示哈希值。4. json是现代web服务中最常用的数据交换格式…

    2025年12月15日 好文分享
    000
  • Golang如何实现自动化API文档 集成Swagger UI与代码注释生成

    golang实现自动化api文档可通过swagger ui结合代码注释自动生成文档,从而提升开发效率并确保文档的实时性和准确性。其步骤包括:1. 选择swaggo/swag作为swagger规范库;2. 安装swag cli工具;3. 在代码中按规范添加注释描述api信息;4. 运行swag ini…

    2025年12月15日 好文分享
    000
  • 如何用Golang开发简易爬虫程序 使用colly框架入门实战

    用golang写爬虫不难,尤其使用colly框架时上手快。1. 安装colly并创建基础爬虫:执行go get github.com/gocolly/colly/v2,编写代码创建collector实例、设置回调函数、访问目标url提取页面标题;2. 抓取列表页中的链接:通过c.onhtml配合cs…

    2025年12月15日 好文分享
    000
  • 如何在Goland IDE中优化Golang 配置远程调试与热加载

    配置远程调试需先准备环境并设置goland连接;2.热加载通过工具如air实现并优化配置。首先确保远程服务器安装go和delve,用go install命令部署dlv,并开放防火墙端口。在goland中配置ssh或docker连接,设置路径映射后启动delve监听。热加载方面,使用air工具,创建.…

    2025年12月15日 好文分享
    000
  • Golang如何管理前端资源依赖 讲解embed包与静态资源打包方案

    使用go的embed包管理前端资源依赖的核心优势在于部署便捷和版本一致性。通过将前端构建产物(如html、css、js等)直接嵌入go二进制文件中,消除了外部文件依赖,使部署只需分发一个文件即可。1. 具体操作包括前端构建工具输出到指定目录,再通过//go:embed指令引用该目录,并使用http.…

    2025年12月15日 好文分享
    000
  • 怎样设计Golang微服务的监控指标 自定义Prometheus指标的实践方法

    设计 golang 微服务监控指标需先明确业务目标,选择合适指标类型并规范命名与标签。1. 明确监控需求,如接口延迟、成功率、资源泄漏等;2. 使用 prometheus/client_golang 注册 counter、gauge、histogram、summary 指标;3. 在业务逻辑中更新指…

    2025年12月15日 好文分享
    000
  • Go语言与GUI开发:现状、挑战与实践选择

    Go语言并非主要为图形用户界面(GUI)开发而设计,因此其主流集成开发环境(IDE)通常不内置类似Visual Studio或NetBeans那样的可视化GUI设计器。尽管Go语言本身具备构建GUI应用的能力,但其生态系统在这方面相对不成熟,开发者需依赖第三方库和工具,并通常采用代码驱动或Web技术…

    2025年12月15日
    000
  • Go 语言编译与链接:掌握一体化构建流程

    Go语言提供了强大的内置工具链,能够实现代码的编译与链接一步完成,无需手动调用底层编译器(如6g)和链接器(如6l)。本文将深入探讨Go语言的构建系统,介绍如何高效利用go build和go run命令简化开发流程,并探讨在复杂项目中使用构建系统(如Makefile)的优势,从而提升开发效率和项目管…

    2025年12月15日
    000
  • Golang如何防止Web安全漏洞 讲解CSRF/XSS防护最佳实践

    csrf是跨站请求伪造攻击,防范方法包括使用csrf token、二次确认、检查请求来源、使用自定义header或token认证,并启用框架内置的csrf中间件。xss攻击常见于用户输入内容的地方,拦截手段有输入过滤、使用模板引擎自动转义、设置content-security-policy头、避免拼…

    2025年12月15日 好文分享
    000
  • Golang如何实现简单的HTTP服务器 使用net/http包快速搭建

    搭建http服务器在golang中非常方便,使用标准库net/http即可实现。1. 创建最简http服务:通过http.handlefunc注册处理函数,http.listenandserve启动服务器监听8080端口;2. 添加多个路由:可为不同路径如/about、/api/data注册对应处理…

    2025年12月15日 好文分享
    000
  • 怎样用Golang编写一个Web爬虫 Golang爬虫开发的核心技术与实现

    golang编写高效web爬虫需掌握五大核心步骤:1.选择合适库如net/http、goquery、colly处理http请求与html解析;2.通过goroutine和channel实现并发抓取并控制并发数量;3.设置user-agent、使用代理ip、控制频率、遵守robots.txt、处理验证…

    2025年12月15日 好文分享
    000
  • Golang模板渲染失败怎么解决?Golang模板引擎使用技巧

    golang模板渲染失败通常因语法错误、数据类型不匹配或路径错误。解决方法包括:1.检查模板语法,确保标记完整且函数有效;2.确认传入数据类型与模板字段匹配;3.处理错误返回,使用if err != nil判断并记录日志;4.验证文件路径是否正确,可结合os.stat检查权限;5.调试时使用text…

    2025年12月15日 好文分享
    000
  • Go项目使用Swagger文档生成报错怎么办

    go项目使用swagger生成文档报错的解决方法包括:1. 确认已安装swag工具并配置好环境变量;2. 检查代码注释格式是否符合swagger规范,如@summary、@param等标签是否正确使用;3. 运行go mod tidy确保依赖管理无误;4. 查看swag init命令执行失败的具体原…

    2025年12月15日 好文分享
    000
  • Golang中高性能HTTP服务器的设计与实现

    构建高性能golang http服务器的关键在于利用goroutines和channels实现并发处理、连接池复用tcp连接、使用buffer i/o减少系统调用、选择合适的http框架、启用gzip压缩、缓存静态资源、监控调优性能、合理配置keep-alive、实施负载均衡以及支持websocke…

    2025年12月15日 好文分享
    000
  • 如何设计可维护的Golang项目结构

    一个可维护的 golang 项目结构应遵循清晰模块划分、合理依赖管理和统一代码风格。1. 明确项目目标和边界,确定模块划分基础;2. 使用分层架构,包括 cmd/(入口点)、internal/(私有模块,如 app、domain、service、repository、config)、pkg/(公共代…

    2025年12月15日 好文分享
    000
  • JSP在Debian上的缓存机制如何配置

    在Debian操作系统中优化JSP的缓存机制,可以通过多种方式来提升性能并减少服务器资源消耗。以下是一些常见的配置方法: 利用Servlet容器自带的缓存功能: 页面内容缓存:通过调整Context元素下的Resources子元素参数实现页面缓存,例如添加如下配置代码:“` &#8220…

    2025年12月15日
    000
  • JSP在Debian上的性能调优策略有哪些

    在Debian系统上提升JSP应用的运行效率,可以从多个方面入手,包括代码层面的改进、服务器配置的优化以及资源管理等方面。以下是具体的优化方法: 代码改进 降低JSP页面中Java脚本的使用:推荐将业务逻辑封装到Servlet或独立的Java类中,避免在JSP页面中嵌入大量Java代码,从而降低页面…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信