【问题标题】:Multiple tag names in lxml's iterparse?lxml的iterparse中有多个标签名称?
【发布时间】:2010-08-19 17:25:43
【问题描述】:

有没有办法从 lxml 的 lxml.etree.iterparse 中获取多个标签名称?我有一个类似文件的对象,具有昂贵的读取操作和许多标签,因此获取所有标签或执行两次传递是次优的。

编辑:它类似于 Beautiful Soup 的 find(['tag-1', 'tag-2]),除了作为 iterparse 的参数。想象一下为<td><div> 标签解析一个HTML 页面。

【问题讨论】:

  • 你能添加一个例子吗?我不确定您所说的“多个标签名称”是什么意思。您的意思是等同于使用您正在寻找的多个可能选项执行 .find() 吗?包含您希望接收的内容的 XML 的简短部分(或只是组成 XML)的示例将是最佳选择。

标签: python lxml elementtree


【解决方案1】:

我知道我玩游戏迟到了,但也许其他人需要帮助解决同样的问题。 此代码将为Tag1Tag2 标签生成事件:

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

【讨论】:

    【解决方案2】:

    我不是 100% 确定您在这里所说的“获取所有标签”是什么意思,但也许这就是您要寻找的:

    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 在解析过程中动态生成事件,因此您只需读取所需的数据。但是,您无法在解析期间跳过阅读元素,因为您不知道要跳过多远。在上面,我们只是忽略了我们不感兴趣的标签。

    您可能已经知道:不要对 html 使用 xml 解析器。 编辑 - 原来 lxml 支持 html 解析,但你应该查看文档以了解程度。

    【讨论】:

    • 很好的例子,谢谢。你可以用iterparse的tag参数来限制标签​​,但我不认为你可以放多个标签。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 2011-07-05
    • 2012-04-22
    • 2020-10-07
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多