gpt4 book ai didi

python - 使用 Python lxml 和 Iterparse 解析大型 XML 文件

转载 作者:行者123 更新时间:2023-11-28 23:04:47 25 4
gpt4 key购买 nike

我正在尝试使用 lxml 和 iterparse 方法编写一个解析器来单步执行包含许多项目的非常大的 xml 文件。

我的文件是这样的格式:

<item>
<title>Item 1</title>
<desc>Description 1</desc>
<url>
<item>http://www.url1.com</item>
</url>
</item>
<item>
<title>Item 2</title>
<desc>Description 2</desc>
<url>
<item>http://www.url2.com</item>
</url>
</item>

到目前为止,我的解决方案是:

from lxml import etree

context = etree.iterparse( MYFILE, tag='item' )

for event, elem in context :
print elem.xpath( 'description/text( )' )
elem.clear( )
while elem.getprevious( ) is not None :
del elem.getparent( )[0]

del context

当我运行它时,我得到类似于:

[]
['description1']
[]
['description2']

空白集是因为它还提取了 url 标签的子项标签,并且它们显然没有描述字段可以用 xpath 提取。我的希望是逐一解析每个项目,然后根据需要处理子字段。我只是在学习 lxml 库,所以我很好奇是否有一种方法可以拉出主要项目,同时在遇到任何子项目时单独留下?

最佳答案

无论如何,核心实现都会解析整个 xml。 etree.iterparse 只是一个生成器风格的 View ,它提供了一个简单的标签名称过滤(参见文档字符串 http://lxml.de/api/lxml.etree.iterparse-class.html )。如果你想要一个复杂的过滤,你应该自己做。

解决方案:同时注册开始事件:

iterparse(self, source, events=("start", "end",), tag="item")

并且有一个 bool 值来知道你什么时候在“item”端,什么时候在“item/url/item”端。

关于python - 使用 Python lxml 和 Iterparse 解析大型 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7182234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com