Filtragem de árvore de elementos Python por XPath
Sep 04 2020
imagine que tenho um XML como este:
<root>
<elements>
<element> foo </element>
<element is="false"> foo </element>
<element is="false"> bli </element>
<element is="false"> bla </element>
</elements>
</root>
Como posso fazer isso:
import xml.etree.ElementTree as ET
root = ET.fromstring(XmlFromAbove)
res_a = root.findall("element[@is='false']")) ##<- This gives me all elements with the specific attribute
res_b = root.findall("element[not@is='false']")) ##<- This would be nice to give me all elements without that specific attribute (`<element> foo </element>` in this case)
Bem, eu sei que res_bnão vai funcionar, mas acho que este é um problema comum, então alguém tem uma ideia de qual é a solução alternativa para isso?
Para apontar um pouco mais (copiado dos comentários)
Eu poderia encontrar o elemento que contém "foo" com certeza, mas o que eu quero saber é se existe uma maneira de encontrar algum elemento que NÃO contenha o atributo é = "false".
Respostas
2 balderman Sep 04 2020 at 17:10
ver abaixo
import xml.etree.ElementTree as ET
xml = '''<root>
<elements>
<element> foo </element>
<element is="false"> foo </element>
<element is="false"> bli </element>
<element is="false"> bla </element>
<element please="false"> no_is </element>
<element is="true"> with_true_is </element>
</elements>
</root>'''
root = ET.fromstring(xml)
no_is_lst = [e for e in root.findall('.//element') if 'is' not in e.attrib]
for e in no_is_lst:
print(e.text)
resultado
foo
no_is
deadshot Sep 04 2020 at 16:59
Você pode usar lxml
from lxml import etree
root = etree.fromstring(data)
res = root.xpath(".//element[not(@is)]")
print(res[0].text) #foo
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino