新闻中心
使用Selenium抓取网页中关联的H2标题及其段落内容

本教程详细介绍了如何利用selenium和xpath定位策略,高效地从html文档中抓取具有层级关系的h2标题及其后续所有p标签内容。通过构建一个字典结构,将h2标题作为键,其关联的p标签文本聚合为值,最终实现将非结构化网页内容转化为结构化的标题与内容对,并提供了完整的python代码示例。
在网页数据抓取任务中,我们经常需要提取具有特定层级或关联关系的内容,例如文章的标题(通常是H标签)及其对应的正文段落(P标签)。本教程将指导您如何使用Selenium WebDriver,结合XPath定位策略,精确地抓取网页中H2标题及其紧随其后的所有P标签内容,并将其组织成结构化的数据格式。
1. 理解目标数据结构
假设我们有以下HTML结构,其中每个
标签代表一个文章标题,其后紧跟着若干个
标签,这些
标签共同构成了该标题下的文章内容:
<h2><span>Title1</span></h2>
<p>text I want</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/1070">
<img src="https://img.php.cn/upload/ai_manual/000/000/000/175680049013074.png" alt="Mureka">
</a>
<div class="aritcle_card_info">
<a href="/ai/1070">Mureka</a>
<p>Mureka是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="Mureka">
<span>1091</span>
</div>
</div>
<a href="/ai/1070" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="Mureka">
</a>
</div>
<p>text I want</p>
<h2><span>Title2</span></h2>
<p>text I want</p>
<p>text I want</p>
<p>text I want</p>
<h2><span>Title3</span></h2>
<p>text I want</p>
<p>text I want</p>我们的目标是将这些数据转换为以下结构:
[{'title': 'Title1', 'content': 'text I want text I want'},
{'title': 'Title2', 'content': 'text I want text I want text I want'},
{'title': 'Title3', 'content': 'text I want text I want'}]其中,每个H2标签的文本作为title,其后所有P标签的文本拼接起来作为content。
2. 核心抓取策略
实现这一目标的关键在于:
- 识别所有H2标题: 作为内容的逻辑分隔符和键。
- 识别所有P标签: 作为要抓取的内容片段。
- 建立P标签与H2标题的关联: 对于每个P标签,我们需要确定它属于哪个H2标题。这里将利用XPath的preceding-sibling::h2[1]轴来查找每个P标签最近的前一个H2同级元素。
- 聚合内容: 将属于同一个H2标题下的所有P标签文本拼接起来。
3. Selenium环境准备
首先,确保您已安装Selenium库和WebDriver管理器。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 初始化Chrome WebDriver
# 使用webdriver_manager自动管理浏览器驱动
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 模拟加载HTML内容
# 在实际应用中,您会使用 driver.get("http://your-website.com")
html_content = '''
<h2><span>Title1</span></h2>
<p>text I want</p>
<p>text I want</p>
<h2><span>Title2</span></h2>
<p>text I want</p>
<p>text I want</p>
<p>text I want</p>
<h2><span>Title3</span></h2>
<p>text I want</p>
<p>text I want</p>
'''
driver.get("data:text/html;charset=utf-8," + html_content)4. 逐步实现数据抓取
4.1 初始化数据结构
我们首先遍历所有的
标签,以它们的文本作为字典的键,并初始化一个空字符串作为值。这将为每个标题创建一个占位符,用于后续聚合其内容。# 查找所有H2标签,并初始化一个字典
# 字典的键是H2的文本,值初始化为空字符串
data = dict((e.text, '') for e in driver.find_elements(By.CSS_SELECTOR, 'h2'))
# 此时data可能为: {'Title1': '', 'Title2': '', 'Title3': ''}4.2 关联P标签并聚合内容
接下来,我们遍历所有的
标签。对于每个
标签,我们使用XPath preceding-sibling::h2[1]来定位其最近的前一个同级
元素。然后,将当前
标签的文本添加到该
标题对应的字典值中。# 遍历所有P标签,将其内容关联到对应的H2标题
for p in driver.find_elements(By.CSS_SELECTOR, 'p'):
# 使用XPath查找当前P标签最近的前一个H2同级元素
# [1]确保只选择最近的一个
h2_text = p.find_element(By.XPATH, './preceding-sibling::h2[1]').text
# 将P标签的文本添加到对应H2标题的值中,用空格分隔
data[h2_text] = data[h2_text] + ' ' + p.text
# 打印聚合后的数据
print("聚合后的原始字典:", data)
# 预期输出: {'Title1': ' text I want text I want', 'Title2': ' text I want text I want text I want', 'Title3': ' text I want text I want'}
XPath解释:
- ./:表示从当前元素(即当前的
标签)开始。
- preceding-sibling:::这是一个轴(axis),它选择当前元素之前的所有同级元素。
- h2:指定我们只对
类型的同级元素感兴趣。
- [1]:这是一个谓词(predicate),它选择集合中的第一个元素。在这里,它确保我们只获取距离当前
标签最近的那个
标签。
4.3 整理最终输出格式
虽然上述字典已经包含了所有数据,但通常我们更希望将数据整理成列表形式,例如标题列表、内容列表,或者更推荐的——一个包含字典的列表,每个字典代表一个完整的文章条目。
方式一:提取标题和内容列表
# 提取标题列表
titles = list(data.keys())
print("\n标题列表:", titles)
# 预期输出: ['Title1', 'Title2', 'Title3']
# 提取内容列表
contents = list(data.values())
print("内容列表:", contents)
# 预期输出: [' text I want text I want', ' text I want text I want text I want', ' text I want text I want']方式二:生成结构化的字典列表(推荐)
为了保持数据的结构化和可读性,强烈建议将结果组织成一个包含字典的列表,每个字典包含title和content键。
# 生成一个包含字典的列表,每个字典代表一个文章条目
structured_data = [{'title': x, 'content': y} for x, y in data.items()]
print("\n结构化数据(字典列表):", structured_data)
# 预期输出:
# [{'title': 'Title1', 'content': ' text I want text I want'},
# {'title': 'Title2', 'content': ' text I want text I want text I want'},
# {'title': 'Title3', 'content': ' text I want text I want'}]5. 完整代码示例
将上述所有步骤整合,形成一个完整的、可运行的Python脚本:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 1. 初始化WebDriver
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 2. 模拟加载HTML内容
html_content = '''
<h2><span>Title1</span></h2>
<p>text I want</p>
<p>text I want</p>
<h2><span>Title2</span></h2>
<p>text I want</p>
<p>text I want</p>
<p>text I want</p>
<h2><span>Title3</span></h2>
<p>text I want</p>
<p>text I want</p>
'''
driver.get("data:text/html;charset=utf-8," + html_content)
# 3. 初始化数据字典:以H2文本为键,空字符串为值
data = dict((e.text, '') for e in driver.find_elements(By.CSS_SELECTOR, 'h2'))
# 4. 遍历所有P标签,并将其内容聚合到对应的H2标题下
for p in driver.find_elements(By.CSS_SELECTOR, 'p'):
# 使用XPath定位当前P标签最近的前一个H2同级元素
h2_text = p.find_element(By.XPATH, './preceding-sibling::h2[1]').text
# 拼接P标签的文本到对应H2的值中
data[h2_text] = data[h2_text] + ' ' + p.text
# 5. 将聚合后的数据转换为结构化的字典列表
structured_output = [{'title': x, 'content': y} for x, y in data.items()]
# 6. 打印最终结果
print(structured_output)
# 7. 关闭WebDriver
driver.quit()6. 注意事项与总结
- XPath的精确性: preceding-sibling::h2[1]是此方法的核心,它确保了每个P标签都被正确地关联到其最近的H2标题。如果HTML结构更复杂,例如H2和P之间可能存在其他不相关的标签,此XPath仍然有效,因为它只关心同级元素。
- 内容拼接: 在拼接P标签文本时,使用' ' + p.text可以确保不同段落之间有空格分隔,提高可读性。
- 健壮性: 这种方法对于HTML结构相对一致的页面非常有效。如果H2和P标签的层级关系或顺序不固定,可能需要调整XPath或其他定位策略。
- 数据清洗: 抓取到的文本可能包含多余的空格、换行符等,在实际应用中,通常需要进行额外的数据清洗步骤(例如使用.strip()或正则表达式)来获取更干净的数据。
- 推荐输出格式: 将数据组织成包含字典的列表(如[{'title': '...', 'content': '...'}])是处理结构化数据的最佳实践,因为它清晰、易于访问和进一步处理(如保存到JSON、CSV或数据库)。
通过本教程,您应该能够熟练地使用Selenium和XPath来抓取网页中具有层级关联的标题和内容,并将它们转化为易于分析和使用的结构化数据。
以上就是使用Selenium抓取网页中关联的H2标题及其段落内容的详细内容,更多请关注其它相关文章!
# 单选框
# 自学英语网站建设
# 察隅林芝网站建设流程
# 医院网站建设排名第一
# 长春抖音推广官方网站
# 上海新站seo技术
# 肇庆seo网络推广专业
# 亳州新型营销推广策划
# 奉化网络推广招聘网站
# 兴宁全网推广营销
# 购物网站建设技术难点
# 转换为
# 转化为
# 这是一个
# 将其
# css
# 表单
# 数据结构
# 遍历
# 结构化
# python脚
# webdriver
# 数据清洗
# csv
# 浏览器
# 正则表达式
# json
# js
# html
# python
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
MongoDB聚合管道:正确匹配对象数组中_id的方法
微信网页版官方入口直达 微信网页版网页版登录使用方法
实现全屏滚动与导航点:专业教程
Go语言HTML解析:利用Goquery精准获取指定元素内容
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
必由学官网首页入口 必由学教师网页版登录指南
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
mcjs网页版流畅运行 mcjs低配电脑畅玩入口
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验
12306选座怎么选到临时改签座_12306改签选座策略与步骤
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
qq音乐在线播放入口_qq音乐电脑版登录链接
vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
Composer如何解决json扩展缺失的错误
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
解决移动端滚动问题的overflow属性应用指南
在Socket.IO连接中实现Access Token自动更新与动态重连
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
微信网页版官方快速登录入口 微信网页版网页版账号直达
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
Pandas DataFrame 多条件优先级排序与排名
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
Discord Slash 命令响应超时问题的异步解决方案
将JSON对象数组转置为键值对列表的实用指南
高德地图沿途添加点失败如何解决 高德多点规划方法
Golang如何使用net/url解析URL_Golang URL解析与处理方法
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
抓大鹅无需下载版 抓大鹅秒玩版入口
jQuery Mask 插件中实现电话号码固定前导零的教程
Lar*el DB::listen 事件中的查询执行时间单位解析
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
高德地图怎么看全景照片_高德地图全景照片浏览教程
抖音网页版快捷访问 抖音网页版网页版入口操作教程
Spyder启动失败:字体文件权限拒绝错误解决方案
J*aScript中针对特定容器内图片动画的实现教程
漫蛙2漫画入口 漫蛙正版网页漫画直达网址
mc.js官网登录入口 mc.js官方登录入口最新版
VS Code远程开发时如何处理文件权限问题


2025-11-01
浏览次数:次
返回列表
</a>
</div>
<p>text I want</p>
<h2><span>Title2</span></h2>
<p>text I want</p>
<p>text I want</p>
<p>text I want</p>
<h2><span>Title3</span></h2>
<p>text I want</p>
<p>text I want</p>