How to find recursively for a tag of XML using LXML?

PythonXmlFindLxml

Python Problem Overview


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

Using lxml is it possible to find recursively for tag " f1 "? I tried findall method but it works only for immediate children.

I think I should go for BeautifulSoup for this !!!

Python Solutions


Solution 1 - Python

You can use XPath to search recursively:

>>> 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>]

Solution 2 - Python

iterfind() iterates over all Elements that match the path expression

findall() returns a list of matching Elements

find() efficiently returns only the first match

findtext() returns the .text content of the first match

Illustrative Examples:

>>> 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]"))
[]

Reference: http://lxml.de/tutorial.html#elementpath

(This answer is relevant selective selection from the content at this link)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionshahjapanView Question on Stackoverflow
Solution 1 - PythonMax ShawabkehView Answer on Stackoverflow
Solution 2 - PythoncodersofthedarkView Answer on Stackoverflow