XPath výraz 
//li[not(@class="wnd-with-submenu")]/a vám vytáhne všechny elementy 
a, které jsou přímo uvnitř 
li, které nemá třídu 
wnd-with-submenu. Tj. tohle nahrazuje rekurzi, to vám vrátí odkazy rovnou ze všech úrovní. Z 
a získáte název a odkaz. Pak od každého nalezeného 
a použijete 
.//ancestor::ul[1], čímž se vrátíte k nejbližšímu nadřazenému 
ul a z něj získáte 
class, kde bude třeba to 
level-3 (což je předpokládám ta hloubka, kterou chcete).
Takže v tom Pythonu to bude vypadat zhruba takhle nějak:
links = menu_nav.xpath('.//li[not(@class="wnd-with-submenu")]/a')
for link links:
    ul = link.xpath(".//ancestor::ul[1]")
    print(link.text)
    print(link.get("href"))
    print(ul.get("class"))
li_obj = ul_obj[0].xpath('//li[parent::ul[@class="level-2"] and not(parent::ul[@class="level-3"])]/a')
Citovaný XPath výraz najde všechna 
a v elementech 
li, které mají jako rodiče 
ul s třídou 
level-2 a zároveň nemají jako rodiče 
ul s třídou 
level-3. Což je nesmysl, ta druhá podmínka je tam zbytečná – žádný 
li přímo uvnitř 
ul s třídou 
level-2 nemůže mít jako rodiče zároveň 
ul s třídou 
level-3. Tenhle výraz by vám tedy vybral jen všechna 
a v úrovni 
level-2, bez ohledu na to, zda tam je nebo není zanořená třetí úroveň.