lxml的iterparse中多个标签名?

2 投票
2 回答
3321 浏览
提问于 2025-04-16 03:02

有没有办法从lxml的lxml.etree.iterparse中获取多个标签名?我有一个文件对象,读取这个文件的操作比较耗时,而且标签很多,所以一次性获取所有标签或者进行两次读取都不是很理想。

补充说明:这就像Beautiful Soup中的find(['tag-1', 'tag-2']),不过是作为参数传给iterparse。想象一下在解析一个HTML页面时,同时获取<td><div>标签。

2 个回答

4

我不太确定你说的“获取所有标签”具体是什么意思,但也许这就是你想要的:

for event, elem in iterparse(file_like_object):
    if elem.tag == 'td' or elem.tag == 'div':
        # reached the end of an interesting tag
        print 'found:', elem.tag
        # possibly quit early to prevent further parsing
        if exit_condition: break

iterparse 是一种在解析过程中实时生成事件的方法,这样你只会读取所需的数据。不过,在解析时你无法跳过某些元素,因为你不知道该跳过多少。在上面的例子中,我们只是忽略了那些我们不感兴趣的标签。

你可能已经知道:不要用 XML 解析器来解析 HTML。补充说明 - 其实 lxml 支持 HTML 解析,但你应该查看文档,了解它支持的程度。

10

我知道我来得有点晚,但也许还有其他人需要解决同样的问题。这个代码会为 Tag1Tag2 这两个标签生成事件:

etree.iterparse(io.BytesIO(xml), events=('end',), tag=('Tag1', 'Tag2'))

撰写回答