Quelques exemple courants:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<apps>
<app name="mailman" state="working" level="5" />
<app name="wekan" state="inprogress" level="3" />
<app name="nextcloud" state="working" level="7" />
<app name="wordpress" state="working" level="7" />
<app name="plex" state="notworking" />
</apps>
</data>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
<script src="lib.js"></script>
</head>
<body>
<p class="text-bold">Un morceau de texte</p>
<p class="text-emph">Un autre paragraphe</p>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<office:document-content office:version="1.2">
[...]
<office:body>
<office:text>
<text:p text:style-name="P1">
Hello <text:span text:style-name="T1">world!</text:span>
</text:p>
</office:text>
</office:body>
</office:document-content>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
<script src="lib.js"></script>
</head>
<body>
<p class="text-bold">Un morceau de texte</p>
<p class="text-emph">Un autre paragraphe</p>
</body>
</html>
<p class="red">
et </p>
class="red"
head
, body
, script
, p
, …
"Un morceau de texte"
xml.tree.ElementTree
: ElementTree API, inclue de base dans Pythonlxml
: Très complète, support de nombreux standardBeautifulSoup
: Interface simple, conçu pour parser du HTML contenant des erreurs<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
<script src="lib.js"></script>
</head>
<body>
<p class="text-bold">Un morceau de texte</p>
<p class="text-emph">Un autre paragraphe</p>
</body>
</html>
xml.tree.ElementTree
from xml.etree import ElementTree as ET
root = ET.parse("monfichier.html")
body = root.find("body")
print(body[0]) # --> <Element 'p' at 0x12345>
print(body[0].tag) # --> p
print(body[0].attrib) # --> {'class': 'text-bold'}
print(body[0].text) # --> Un morceau de texte
print(list(body[0])) # --> [] (pas d'elements fils)
# Trouver tout les <p> dans le body
tous_les_p = body.findall("p")
from xml.etree import ElementTree as ET
root = ET.parse("monfichier.html")
body = root.find("body")
# Ajout d'un nouvel element dans <body>
# <p class="text-underline" id="new">Du texte en plus</p>
nouveau_p = ET.SubElement(body, "p", clas="text-underline", id="new")
root.write("monfichier_2.xml")
lxml.etree.iterparse
ET.parse("fichier.xml")
explose la RAM pour les gros fichiers.iterparse
fourni un iterateur pour parser au fur et à mesure, qui plus est seulement sur des tags specifiquesfrom lxml import etree
iterator = etree.iterparse("fichier.xml", tag="p")
for event, element in iterator:
# [...] traiter l'element
Ça consomme toujours de la RAM … besoin d’un trick en + … c.f. https://stackoverflow.com/questions/12160418
from lxml import etree
def clear_elem_and_ancestors(elem):
elem.clear()
for ancestor in elem.xpath('ancestor-or-self::*'):
while ancestor.getprevious() is not None:
del ancestor.getparent()[0]
iterator = etree.iterparse("fichier.xml", tag="p")
for event, element in iterator:
# [...] traiter l'element
clear_elem_and_ancestors(element)