0

0

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

碧海醫心

碧海醫心

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

|

942人浏览过

|

来源于php中文网

原创

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

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

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

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

在网页抓取任务中,我们经常会遇到需要从特定父元素(例如一个

)中提取多个子元素(例如一系列

标签)的文本内容,并将这些内容聚合到一个单一的数据字段中的场景。一个典型的HTML结构可能如下所示:

title text

text text text...

text text text...


text text text...

这里的挑战在于,

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

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

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

divs = response.xpath('/html/body/div[6]/div/section[2]/article/div/div/div')
for p in divs.xpath('.//p'):  # 遍历所有

标签 print(p.get()) story = p # 问题所在:循环结束后,p只保留了最后一个元素 yield { 'story': story }

这段代码的意图是遍历所有

标签并打印其内容,然后将p变量赋值给story。然而,在Python的for循环中,每次迭代都会更新p变量的值。当循环结束时,p将只持有最后一个被迭代到的

标签的Selector对象。因此,story = p这行代码最终只会将最后一个

标签的内容赋给story,导致之前所有

标签的内容丢失。

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

GitHub Copilot
GitHub Copilot

GitHub AI编程工具,实时编程建议

下载

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

解决上述问题的核心思路是:首先,使用XPath选择器一次性捕获所有目标

标签;然后,通过列表推导式(List Comprehension)提取每个

标签的文本内容并进行清理;最后,使用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')

        # 使用列表推导式提取所有

标签的文本内容,并去除首尾空白 # .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表达式直接定位到包含目标

      标签的父div,然后使用//p来选择该div下的所有后代

      标签,无论它们嵌套的层级有多深。

    • 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.get():获取当前

      标签的完整HTML内容(包括标签本身)。如果只需要标签内的纯文本,可以使用p.xpath('./text()').get()。为了简化并符合原答案的意图,这里假设.get()后会处理掉HTML标签。实际上,如果p.get()返回的是

      text

      ,则p.get().strip()会得到text。
    • .strip():对提取出的字符串进行处理,移除其首尾的空白字符(包括空格、换行符等),确保数据干净。
    • if p.get() and p.get().strip():这是一个过滤条件,确保只有非空且去除空白后仍有内容的

      标签才会被包含在最终的列表中。这有助于排除像

       


      这类仅包含空白或换行符的标签。
  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页面中抓取不确定数量的

标签内容,并将其整合为一个单一的字符串字段。关键在于避免在循环中简单地覆盖变量,而是通过列表收集所有数据片段,然后统一进行连接。同时,强调了XPath的健壮性,建议在实际开发中优先使用更稳定、更具描述性的选择器。掌握这些技巧,将能更灵活地处理各种复杂的网页数据提取任务。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

771

2023.11.10

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

775

2023.08.22

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

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

298

2023.08.03

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

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

212

2023.09.04

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

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

1500

2023.10.24

字符串介绍
字符串介绍

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

623

2023.11.24

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

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

613

2024.03.22

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

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

588

2024.04.29

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号