lxml的iterparse中多个标签名?
有没有办法从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
我知道我来得有点晚,但也许还有其他人需要解决同样的问题。这个代码会为 Tag1
和 Tag2
这两个标签生成事件:
etree.iterparse(io.BytesIO(xml), events=('end',), tag=('Tag1', 'Tag2'))