0

0

Python lxml的iterwalk怎么用 同时遍历元素和事件

幻夢星雲

幻夢星雲

发布时间:2025-12-22 11:11:25

|

527人浏览过

|

来源于php中文网

原创

lxml.iterwalk()边遍历XML/HTML树边返回(element, event, data)三元组,event含'start'、'end'、'text'、'tail',data在文本事件中为内容,其余为None;支持events参数筛选事件类型,适用于精细解析控制。

python lxml的iterwalk怎么用 同时遍历元素和事件

lxml.iterwalk() 用来边遍历 XML/HTML 树边获取“事件”(如开始标签、结束标签、文本等),同时拿到对应元素对象。它比 iterparse() 更灵活,适合需要精细控制解析过程的场景,比如边解析边过滤、改写、统计或提取混合内容。

基本用法:获取事件和元素

调用 iterwalk() 时,默认返回三元组:(element, event, data)。其中:

  • element 是当前触发事件的 lxml 元素对象(etree.Element
  • event 是字符串,常见值有:'start'(进入标签)、'end'(离开标签)、'text'(遇到文本节点)、'tail'(遇到尾部文本)
  • data'text''tail' 事件中为对应文本内容;其他事件中为 None

示例:

from lxml import etree

html = '

Hello

立即学习Python免费学习笔记(深入)”;

沁言学术
沁言学术

你的论文写作AI助理,永久免费文献管理工具,认准沁言学术

下载
World
' root = etree.fromstring(html)

for elem, event, data in etree.iterwalk(root): if event == 'start': print(f"进入: {elem.tag}") elif event == 'end': print(f"离开: {elem.tag}") elif event == 'text' and data and data.strip(): print(f"文本: '{data.strip()}'")

只关注特定事件类型

可以通过 events 参数指定只监听哪些事件,减少干扰:

  • events=('start', 'end') —— 忽略文本和尾部,只跟踪结构变化
  • events=('start',) —— 类似深度优先遍历,每个元素第一次出现时触发
  • events=('end',) —— 每个元素完全解析完(子树处理完毕)后触发,适合做清理或汇总

例如,只在元素闭合时收集其完整文本(含子节点文本):

texts = {}
for elem, event, data in etree.iterwalk(root, events=('end',)):
    if event == 'end':
        # 此时 elem 的所有子节点已处理完毕
        full_text = (elem.text or '') + ''.join(
            child.tail or '' for child in elem
        )
        texts[elem.tag] = full_text.strip()

配合 XPath 或属性条件做条件遍历

可以在循环中结合 elem.tagelem.get('attr')elem.xpath() 做实时判断:

  • 跳过某些标签:if elem.tag in ('script', 'style'): continue
  • 只处理带特定 class 的 div:if elem.tag == 'div' and 'main' in elem.get('class', ''):
  • 提取所有带 href 的 a 标签及其链接文本(注意 text/tail 分布):
links = []
for elem, event, data in etree.iterwalk(root):
    if elem.tag == 'a' and elem.get('href') and event == 'start':
        # 记录链接地址
        href = elem.get('href')
        # 下一个非空 text 就是链接文本(简单情况)
        link_text = (elem.text or '').strip()
        if not link_text:
            # 可能文本在子节点里,或 tail 中,需进一步处理
            link_text = ''.join(t for t in elem.itertext()).strip()
        links.append((href, link_text))

注意事项和常见坑

  • 'start' 事件在元素被解析**开始时**触发,此时其子节点尚未处理,elem.text 是开始标签后的直接文本,但子元素还没构建好
  • 'end' 事件在元素**完全解析后**触发,此时 elem.text 和所有 child.tail 都已就位,适合读取完整内容
  • 文本可能分散在 elem.textchild.tail、甚至嵌套中的 grandchild.tail,不要只看 elem.text
  • iterwalk() 默认从根节点开始遍历整棵树;若只想遍历某子树,传入该子元素即可

基本上就这些。它不复杂,但容易忽略事件语义和文本分布逻辑。多打印几个 (elem.tag, event, repr(data)) 看几遍,节奏就清楚了。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

760

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

639

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

762

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

619

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1265

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

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

精品课程

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

共4课时 | 4.7万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

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

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