HTML nodo interno utilizzando ElementTree
-
23-08-2019 - |
Domanda
Sto usando ElementTree di analizzare un file XML. In alcuni campi, ci saranno dati HTML. Ad esempio, si consideri una dichiarazione nel modo seguente:
<Course>
<Description>Line 1<br />Line 2</Description>
</Course>
Ora, supponendo _course è una variabile elemento che detengono questo elemento Couse. Voglio accedere descrizione di questo corso, così faccio:
desc = _course.find("Description").text;
Ma poi disc contiene solo "Linea 1". Ho letto qualcosa circa l'attributo .tail, così ho provato anche:
desc = _course.find("Description").tail;
E ho la stessa uscita. Cosa devo fare per rendere disc essere "Linea 1
Linea 2" (o letteralmente nulla tra e)? In altre parole, sto cercando qualcosa di simile alla proprietà .innerText in C # (e molte altre lingue suppongo).
Soluzione
Avete qualche controllo sulla creazione del file XML? Il contenuto di tag XML che contengono tag XML (o simili), o caratteri di marcatura ( '<
', ecc) che devono essere codificati per evitare questo problema. È possibile farlo sia con:
- CDATA sezione
- Base64 o qualche altra codifica (che non include caratteri riservati XML)
- Codifica entità ( '
<
'==
'<
')
Se non è possibile apportare queste modifiche, e ElementTree Non si può ignorare i tag non incluse nello schema XML, allora si dovrà pre-processo il file. Naturalmente, sei fuori di fortuna se lo schema si sovrappone html.
Altri suggerimenti
Si sta cercando di leggere l'attributo di coda dall'elemento sbagliata. Prova
desc = _course.find("br").tail;
L'attributo di coda viene utilizzata per memorizzare finali nodi di testo durante la lettura di file XML misto di contenuti; testo che segue direttamente dopo un elemento sono memorizzati nella coda attributo per l'elemento:
<tag><elem>this goes into elem's text attribute</elem>this goes into elem's tail attribute</tag>
codice semplice frammento di stampare il testo e la coda attributi da tutti gli elementi di XML / XHTML.
import xml.etree.ElementTree as ET def processElem(elem): if elem.text is not None: print elem.text for child in elem: processElem(child) if child.tail is not None: print child.tail xml = '''<Course> <Description>Line 1<br />Line 2 <span>child text </span>child tail</Description> </Course>''' root = ET.fromstring(xml) processElem(root)
Output:
Line 1 Line 2 child text child tail
http://code.activestate.com/recipes/498286- elementtree-text-helper / per una soluzione migliore. Può essere modificato per adattarsi.
P.S. Ho cambiato il mio nome da user839338 come citato nel prossimo post
Personaggi come "<" e "&" sono illegali in elementi XML.
"<" genererà un errore perché il parser lo interpreta come l'inizio di un nuovo elemento.
"&" genererà un errore perché il parser lo interpreta come l'inizio di un'entità carattere.
Alcuni di testo, come il codice JavaScript, contiene un sacco di "<" o caratteri "&". Per evitare il codice errori di script può essere definito come CDATA.
Tutto ciò all'interno di una sezione CDATA viene ignorato dal parser.
Una sezione CDATA inizia con "":
Più informazioni su: http://www.w3schools.com/xmL/xml_cdata.asp
Spero che questo aiuti!
di user839338 risposta , ho wen't e guardai per una soluzione ragionevole, che sembra un po 'come questo.
>>> from xml.etree import ElementTree as etree
>>> corpus = '''<Course>
... <Description>Line 1<br />Line 2</Description>
... </Course>'''
>>>
>>> doc = etree.fromstring(corpus)
>>> desc = doc.find("Description")
>>> desc.tag = 'html'
>>> etree.tostring(desc)
'<html>Line 1<br/>Line 2</html>\n'
>>>
Non c'è modo semplice per eliminare il tag circostante (originariamente <Description>
), ma è facilmente modificato in qualcosa che potrebbe essere utilizzato come necessario, per esempio <div>
o <span>