Как использовать lxml findall() для поиска ключевого слова в элементах
У меня есть следующий ретро-список gamelist.xml, который я пытаюсь вернуть игровым элементам с помощью lxml findall(). Я хочу, чтобы он возвращал совпадения, близкие к названию, которое я ищу, или даже основываясь на части заголовка, который я ищу.
<gameList>
<game id="2652" source="ScreenScraper">
<path>/home/pi/RetroPie/roms/snes/2020 Super Baseball (U).smc</path>
<name>SUPER BASEBALL 2020</name>
<desc>* shortened *</desc>
<image>/home/pi/RetroPie/media/snes/2020 Super Baseball (U)- image.png</image>
<marquee/>
<video>/home/pi/RetroPie/media/snes/2020 Super Baseball (U)- video.mp4</video>
<thumbnail/>
<rating>0.9</rating>
<releasedate>19930713T000000</releasedate>
<developer>Pallas</developer>
<publisher>SNK</publisher>
<genre>Sports</genre>
<players>1-2</players>
</game>
</gameList>
Поэтому я ищу что-то, что вернет игры, которые соответствуют названию, которое я ищу, в примере с "Super Baseball" должно быть возвращено вышеупомянутое (весь элемент игры). Идеи? Я пробовал xpath и другие вещи, но у меня нет возможности заставить его работать как задумано.
Что-то вроде:
#!/usr/bin/env python3
from lxml import etree
tree = etree.parse("/home/pi/scripts/jscraper2/repackxml/snes/gamelist.xml")
root = tree.getroot()
strGame = "Super Baseball 2020"
for game in root.findall("game/name/"+strGame):
print(game)
Что, конечно, ничего не возвращает. Я могу проходить игры один за другим и искать точные совпадения, но это кажется медленным, и я также чувствую, что должен быть более простой способ сделать это:
for game in root:
strName = ""
for ele in game:
if ele.tag == "name":
strName = str(ele.text)
if strName.lower() == gameName.lower():
# at this point, game would be the element
Может быть, есть даже какое-то регулярное выражение, которое я мог бы использовать с приведенным выше для поиска частичных совпадений имен. В любом случае, любая помощь будет отличной. Спасибо!