XPath에 의한 Python Elementtree 필터링
Sep 04 2020
다음과 같은 XML이 있다고 상상해보십시오.
<root>
<elements>
<element> foo </element>
<element is="false"> foo </element>
<element is="false"> bli </element>
<element is="false"> bla </element>
</elements>
</root>
어떻게 할 수 있습니까?
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)
이제 res_b작동하지 않을 것이라는 것을 알고 있지만 이것이 일반적인 문제라고 생각하므로 누구든지 그 해결 방법이 무엇인지 알 수 있습니까?
좀 더 지적하기 위해 (댓글에서 복사)
확실히 "foo"를 포함하는 요소를 찾을 수 있지만 내가 알고 싶은 것은 is = "false"속성을 포함하지 않는 요소를 찾는 방법이 있는지 여부입니다.
답변
2 balderman Sep 04 2020 at 17:10
아래 참조
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)
산출
foo
no_is
deadshot Sep 04 2020 at 16:59
lxml 을 사용할 수 있습니다.
from lxml import etree
root = etree.fromstring(data)
res = root.xpath(".//element[not(@is)]")
print(res[0].text) #foo