当前位置:
首页 > Python基础教程 >
-
Python3标准库:xml.etree.ElementTree XML操纵API(3)
','start-ns','end-ns']
for (event,node) in iterparse('podcasts.opml',EVENT_NAMES):
if event == 'end':
depth -= 1
prefix_len = depth * 2
print(line_template.format(
prefix = prefix_dots,
prefix_len = prefix_len,
suffix = '',
suffix_len = (prefix_width - prefix_len),
node = node,
node_id = id(node),
event = event,
))
if event == 'start':
depth += 1
默认的,只会生成end事件。要查看其他事件,可以将所需的事件名列表传入iterparse()。
以事件方式进行处理对于某些操作来说更为自然,如将XML输入转换为另外某种格式。可以使用这个技术将播可列表(来自前面的例子)从XML文件转换为一个CSV文件,以便把它们加载到一个电子表格或数据库应用。
- import csv
- import sys
- from xml.etree.ElementTree import iterparse
- writer = csv.writer(sys.stdout,quoting=csv.QUOTE_NONNUMERIC)
- group_name = ''
- parsing = iterparse('podcasts.opml',events=['start'])
- for (event,node) in parsing:
- if node.tag != 'outline':
- # Ignore anything not part of the outline.
- continue
- if not node.attrib.get('xmlUrl'):
- #Remember the current group.
- group_name = node.attrib['text']
- else:
- #Output a podcast entry.
- writer.writerow(
- (group_name,node.attrib['text'],
- node.attrib['xmlUrl'],
- node.attrib.get('htmlUrl',''))
- )
这个转换程序并不需要将整个已解析的输入文件保存在内存中,其在遇到输入中的各个节点时才进行处理,这样做会更为高效。
1.6 创建一个定制树构造器
要处理解析事件,一种可能更高效的方法是将标准的树构造器行为替换为一种定制行为。XMLParser解析器使用一个TreeBuilder处理XML,并调用目标类的方法保存结果。通常输出是由默认TreeBuilder类创建的一个ElementTree实例。可以将TreeBuilder替换为另一个类,使它在实例化Element节点之前接收事件,从而节省这部分开销。
可以将XML-CSV转换器重新实现为一个树构造器。
- import io
- import csv
- import sys
- from xml.etree.ElementTree import XMLParser
- class PodcastListToCSV(object):
- def __init__(self,outputFile):
- self.writer = csv.writer(
- outputFile,
- quoting = csv.QUOTE_NONNUMERIC,
- )
- self.group_name = ''
- def start(self,tag,attrib):
- if tag != 'outline':
- # Ignore anything not part of the outline.
- return
- if not attrib.get('xmlUrl'):
- #Remember the current group.
- self.group_name = attrib['text']
- else:
- #Output a pddcast entry.
- self.writer.writerow(
- (self.group_name,
- attrib['text'],
- attrib['xmlUrl'],
- attrib.get('htmlUrl',''))
- )
- def end(self,tag):
- "Ignore closing tags"
- def data(self,data):
- "Ignore data inside nodes"
- def close(self):
- "Nothing special to do here"
- target = PodcastListToCSV(sys.stdout)
- parser
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式