2009-11-28 9 views
7

Soy bastante nuevo en lxml y HTML Parsers en general. Me preguntaba si hay una manera de reemplazar un elemento dentro de un árbol con otro elemento ...Reemplazando elementos con lxml.html

Por ejemplo tengo:

body = """<code> def function(arg): print arg </code> Blah blah blah <code> int main() { return 0; } </code> """ 

doc = lxml.html.fromstring(body) 
codeblocks = doc.cssselect('code') 

for block in codeblocks: 
    lexer = guess_lexer(block.text_content()) 
    hilited = highlight(block.text_content(), lexer, HtmlFormatter()) 
    doc.replace(block, hilited) 

quiero hacer algo por el estilo, pero estos resultados en un "TypeError" porque "hilited" no es un lxml.etree._Element.

¿Esto es factible?

Saludos,

+0

He estado buscando alrededor y me di cuenta de BeautifulSoup tiene esta funcionalidad exacta a través de Vuelvaa, ¿hay algo similar a -this- en lxml? (Si no está bien, sin embargo, todavía estoy interesado) ¡Gracias de nuevo! – tsoporan

Respuesta

4

En cuanto lxml,

En doc.replace(block, hilited)

bloque es objeto Element del lxml, hilited es la secuencia, no se puede reemplazar eso.

Hay 2 maneras de hacer eso

block.text=hilited 

o

body=body.replace(block.text,hilited) 
+0

¡Ah, ya veo! Eso tiene sentido. ¡Gracias! – tsoporan

0

Si eres nuevo a Python analizadores HTML, es posible probar BeautifulSoup, a/html parser XML, lo que le permite modify the parse tree easily.

+0

Acabo de mirar BeautifulSoup, parece que podría ser una mejor opción que lxml.html para mis usos. ¡Gracias por la sugerencia! – tsoporan

Cuestiones relacionadas