2

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

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

4

2 回答 2

8

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

etree.iterparse(io.BytesIO(xml), events=('end',), tag=('Tag1', 'Tag2'))
于 2013-09-26T11:16:47.193 回答
4

我不是 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 解析,但您应该查看文档以了解程度。

于 2011-01-15T04:20:28.187 回答