Menu na stránce webnode.cz má několik úrovní ul. Na každé úrovni ul je třída class level-1 až např. level-3. Je tam seznam položek li a ty které obsahují vnořené menu mají navíc třídu wnd-with-submenu. V pythonu mám rekurzivní funkci, která prochází ty menu resp. ul. Přesněji řečeno první úroveň jsem udělal jako hlavní smyčku tj. ne rekurzivně. Tím projdu první úroveň. Když narazím na podmenu spouštím rekurzivní funkci. Nyní zde je problém s tím xpath. Zdá se to být nevyřešitelné.
Celý html kod sem dávat nechci, je to dlouhé a nepřehledné, zkusím objasnit pseudo kodém. Místo tagu a se spany a názvem článku použiju link A, link B, link c atd... A připomínám, že nyní řeším tu 2. úroveň.
ul level 2
li link 2A
/li
li link 2B
/li
li link 2C (obsahuje menu)
ul level 3
li link 3A /li
li link 3B /li
li link 3C /li
/ul
/li
/ul level 2
Takže já spouštím tu funkci a vidím obsah toho ul level 2. Začnu procházet ty jednotlivé položky menu li ale rozlišuje se jestli je to li bez třídy nebo to li kromě linku obsahuje taky vnořený seznam.
Tento vnořený seznam nesmí být ve výsledku.Zkoušel jsem několik možností a ani jedna nefungovala správně:
# li_obj = ul_obj[0].xpath('.//li[@class="wnd-with-submenu"]')
Toto vypíše jen články s vnořeným menu.
li_obj = ul_obj[0].xpath('.//li[@class="wnd-with-submenu" or not(@class)]')
Toto myslím vypisuje i ty li které jsou zanořené v tom vnořeném ul. Nefungovalo podle potřeby.
li_obj = ul_obj[0].xpath('.//li[not(.//ul[@class="level-3"]//ancestor::li[@class="wnd-with-submenu"])]//a')
[code]
Toto mělo vypsat všechny li v seznamu ul (2. level), bez toho zanořeného menu. Toto však nefunguje. Místo toho se stane to, že to vypíše články bez vnořeného menu, první vnořený článek nevypíše, a ostatní vnořené články vypíše. To je chyba. [b]Vnořené články se nemají vypisovat vůbec[/b] (na to budu volat funkci).
Domnívám se, že výraz [b]not(.//ul) je interpretován tak, že zcela vyloučí ty položky, který obsahuje li 2 level, místo aby poskytlo pouze ten odkaz z této položky li 2 level[/b].
Zkrácený html kód...
[code]
<li class="wnd-with-submenu">
<a class="menu-item">LINK LEVEL 1</a>
<ul class="level-2">
<li>
<a>link level 2 A</a>
</li>
<li>
<a>link level 2 B</a>
</li>
<li class="wnd-with-submenu">
<a>LEVEL 2 C with SUBMENU</a>
<ul class="level-3">
<li>
<a>link level 3 D DON'T!!</a>
</li>
</ul>
</li>
Pak to pokračuje další položkou level 2 a další submenu ...
Ještě stručněji:
li class="wnd-with-submenu"
LINK LEVEL 1
ul class="level-2"
li
link level 2 A /li
li
link level 2 B li
li class="wnd-with-submenu"
link LEVEL 2 C with SUBMENU ul class="level-3"
li
link level 3 D NEVYPISOVAT!! /li
/ul
/li