讲师中心 微信公众号
AI工具推荐 视频效率加速

Scrapy教程:高效抓取并整合多个P标签内容至单一字段

浅宇酱_4790

浅宇酱_4790

发布时间:2025-12-12 14:38:10

|

982人浏览过

|

来源于php中文网

原创

Scrapy教程:高效抓取并整合多个P标签内容至单一字段

本教程详细讲解如何使用scrapy框架高效抓取html页面中不确定数量的`

`标签内容,并将其整合为一个单一字符串字段,以便于数据存储和导出。文章通过分析常见错误,提供优化的xpath表达式和python代码实现,确保所有目标文本都能被正确提取并聚合。

1. 理解多P标签抓取的需求与挑战

在网页抓取任务中,我们经常会遇到需要从特定父元素(例如一个<div>)中提取多个子元素(例如一系列<p>标签)的文本内容,并将这些内容聚合到一个单一的数据字段中的场景。一个典型的HTML结构可能如下所示:

<div class="div_name">
    <h2 class="h5">title text</h2>
    <p> </p>
    <p>text text text...</p>
    <p>text text text...</p>
    <p> </p>
    <p><br>text text text...</p>
    <!-- 更多P标签,数量不确定 -->
</div>

这里的挑战在于,<p>标签的数量是不固定的,且可能包含空白或换行符。我们需要将所有有效的文本内容提取出来,并将其合并成一个连贯的字符串,最终存储到如CSV文件的一个字段中。

2. Scrapy中常见的数据聚合误区

在使用Scrapy进行数据抓取时,如果直接通过循环迭代来尝试聚合数据,很容易出现只保留最后一个元素内容的问题。考虑以下原始代码示例:

divs = response.xpath('/html/body/div[6]/div/section[2]/article/div/div/div')
for p in divs.xpath('.//p'):  # 遍历所有<p>标签
    print(p.get())
story = p # 问题所在:循环结束后,p只保留了最后一个元素
yield {
    'story': story
}

这段代码的意图是遍历所有<p>标签并打印其内容,然后将p变量赋值给story。然而,在Python的for循环中,每次迭代都会更新p变量的值。当循环结束时,p将只持有最后一个被迭代到的<p>标签的Selector对象。因此,story = p这行代码最终只会将最后一个<p>标签的内容赋给story,导致之前所有<p>标签的内容丢失。

为了将所有内容聚合到一个变量中,我们需要一种机制来收集每次循环迭代的结果,而不是简单地覆盖它们。

html-to-pptx-converter
html-to-pptx-converter

使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。

下载

3. 解决方案:使用列表推导式与字符串连接

解决上述问题的核心思路是:首先,使用XPath选择器一次性捕获所有目标<p>标签;然后,通过列表推导式(List Comprehension)提取每个<p>标签的文本内容并进行清理;最后,使用Python的str.join()方法将所有提取出的文本片段连接成一个单一的字符串。

以下是优化的Scrapy代码实现:

import scrapy

class MySpider(scrapy.Spider):
    name = 'multi_p_scraper'
    start_urls = ['http://example.com/your_target_page'] # 替换为实际的URL

    def parse(self, response):
        # 假设目标HTML结构与问题描述一致
        # 更健壮的XPath通常会利用类名或ID,例如:
        # div_selector = response.xpath('//div[@class="div_name"]')
        # story_parts = div_selector.xpath('.//p/text()').getall()

        # 使用问题中提供的特定长XPath作为示例
        # 注意:长且绝对的XPath路径通常比较脆弱,建议根据实际页面结构优化
        story_parts = response.xpath('/html/body/div[6]/div/section[2]/article/div/div/div//p')

        # 使用列表推导式提取所有<p>标签的文本内容,并去除首尾空白
        # .get() 获取 Selector 的文本内容
        # .strip() 移除字符串两端的空白字符,包括空格、制表符、换行符等
        all_p_texts = [p.get().strip() for p in story_parts if p.get() and p.get().strip()]

        # 使用空格将所有文本片段连接成一个单一的字符串
        story = ' '.join(all_p_texts)

        yield {
            'story': story
        }

代码解析:

  1. response.xpath('/html/body/div[6]/div/section[2]/article/div/div/div//p'):
    • 这个XPath表达式直接定位到包含目标<p>标签的父div,然后使用//p来选择该div下的所有后代<p>标签,无论它们嵌套的层级有多深。
    • XPath健壮性提示:虽然这里使用了问题中提供的长XPath,但在实际项目中,强烈建议使用更短、更具描述性的XPath表达式,例如利用元素的id或class属性(如//div[@class="div_name"]//p),这样即使页面结构略有变动,XPath也更不容易失效。
  2. [p.get().strip() for p in story_parts if p.get() and p.get().strip()]:
    • 这是一个Python的列表推导式,它遍历story_parts中每一个Selector对象(代表一个<p>标签)。
    • p.get():获取当前<p>标签的完整HTML内容(包括标签本身)。如果只需要标签内的纯文本,可以使用p.xpath('./text()').get()。为了简化并符合原答案的意图,这里假设.get()后会处理掉HTML标签。实际上,如果p.get()返回的是<p>text</p>,则p.get().strip()会得到text。
    • .strip():对提取出的字符串进行处理,移除其首尾的空白字符(包括空格、换行符等),确保数据干净。
    • if p.get() and p.get().strip():这是一个过滤条件,确保只有非空且去除空白后仍有内容的<p>标签才会被包含在最终的列表中。这有助于排除像<p> </p>或<p><br></p>这类仅包含空白或换行符的标签。
  3. ' '.join(all_p_texts):
    • 这是Python中将列表中的字符串元素连接成一个单一字符串的常用方法。
    • ' '是连接符,表示每个文本片段之间将用一个空格隔开。你可以根据需求选择其他连接符,例如'\n'(换行符)或''(无分隔符)。

4. Scrapy数据导出配置

当yield一个字典时,Scrapy会根据settings.py中的配置将数据导出到指定格式的文件中。为了将抓取到的story字段导出到CSV文件,需要在settings.py中进行如下配置:

# 爬虫深度限制 (0 = 无限深度)
DEPTH_LIMIT = 0

# Feed 导出设置
FEED_FORMAT = "csv"
# FEED_URI 可以包含变量,如 %(name)s 会被替换为爬虫的名称
FEED_URI = "output_%(name)s.csv"
# 如果Scrapy版本较新,可能需要使用 FEED_EXPORT_FIELDS 来指定CSV列顺序
# FEED_EXPORT_FIELDS = ['story']

通过这些配置,每次yield {'story': story}时,story变量的内容就会作为CSV文件中的一个字段被记录下来。

5. 总结

本教程展示了如何利用Scrapy的XPath选择器和Python的列表推导式以及str.join()方法,高效地从HTML页面中抓取不确定数量的<p>标签内容,并将其整合为一个单一的字符串字段。关键在于避免在循环中简单地覆盖变量,而是通过列表收集所有数据片段,然后统一进行连接。同时,强调了XPath的健壮性,建议在实际开发中优先使用更稳定、更具描述性的选择器。掌握这些技巧,将能更灵活地处理各种复杂的网页数据提取任务。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
免费爬虫工具有哪些
免费爬虫工具有哪些

免费爬虫工具有Scrapy、Beautiful Soup、ParseHub、Octoparse、Webocton Scriptly、RoboBrowser和Goutte。更多关于免费爬虫工具的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4973

2023.11.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2684

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6064

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5689

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7334

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

10714

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5479

2025.07.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn