如何使用LXML以递归方式查找XML标记?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用LXML以递归方式查找XML标记?相关的知识,希望对你有一定的参考价值。

<?xml version="1.0" ?>
<data>
    <test >
        <f1 />
    </test >
    <test2 >
        <test3>
         <f1 />
        </test3>
    </test2>
    <f1 />
</data>

使用lxml是否可以递归查找标签“f1”?我试过findall方法,但它只适用于直接的孩子。

我想我应该去为BeautifulSoup这个!!!

答案

您可以使用XPath递归搜索:

>>> from lxml import etree
>>> q = etree.fromstring('<xml><hello>a</hello><x><hello>b</hello></x></xml>')
>>> q.findall('hello')     # Tag name, first level only.
[<Element hello at 414a7c8>]
>>> q.findall('.//hello')  # XPath, recursive.
[<Element hello at 414a7c8>, <Element hello at 414a818>]
另一答案

iterfind()遍历与路径表达式匹配的所有元素

findall()返回匹配元素的列表

find()只能有效地返回第一场比赛

findtext()返回第一场比赛的.text内容

说明性示例:

>>> root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>")
#Find a child of an Element:
>>> print(root.find("b"))
None
>>> print(root.find("a").tag)
a
#Find an Element anywhere in the tree:
>>> print(root.find(".//b").tag)
b
>>> [ b.tag for b in root.iterfind(".//b") ]
['b', 'b']
#Find Elements with a certain attribute:
>>> print(root.findall(".//a[@x]")[0].tag)
a
>>> print(root.findall(".//a[@y]"))
[]

参考:http://lxml.de/tutorial.html#elementpath

(这个答案是从这个链接的内容中选择相关的选择)

以上是关于如何使用LXML以递归方式查找XML标记?的主要内容,如果未能解决你的问题,请参考以下文章

使用 lxml 有效地解析元标记?

Python爬虫_XPath与lxml类库

XML 和 HTML、lxml

使用非utf-8编码在Python中解析XML

如何在没有 XML 的情况下以编程方式将片段添加到活动

如何跳过验证 lxml 中的全局声明问题?