Pemfilteran Python Elementtree oleh XPath
Sep 04 2020
bayangkan saya memiliki XML seperti ini:
<root>
<elements>
<element> foo </element>
<element is="false"> foo </element>
<element is="false"> bli </element>
<element is="false"> bla </element>
</elements>
</root>
Bagaimana saya bisa melakukan ini:
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)
Sekarang, saya tahu itu res_btidak akan berhasil tetapi saya kira ini adalah masalah umum sehingga ada yang tahu apa solusinya?
Untuk menunjukkannya sedikit lebih (disalin dari komentar)
Saya dapat menemukan elemen yang mengandung "foo" dengan pasti tetapi yang ingin saya ketahui adalah jika ada cara untuk menemukan elemen apa pun yang TIDAK mengandung atribut is = "false".
Jawaban
2 balderman Sep 04 2020 at 17:10
Lihat di bawah
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)
keluaran
foo
no_is
deadshot Sep 04 2020 at 16:59
Anda bisa menggunakan lxml
from lxml import etree
root = etree.fromstring(data)
res = root.xpath(".//element[not(@is)]")
print(res[0].text) #foo
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'