2010-06-09 7 views
2

Supposons que j'ai un extrait de HTML comme ceci:En Python, comment supprimer la balise "root" dans un extrait de code HTML?

<div> 
    Hello <strong>There</strong> 
    <div>I think <em>I am</em> feeing better!</div> 
    <div>Don't you?</div> 
    Yup! 
</div> 

Quelle est la meilleure/façon la plus robuste pour éliminer l'élément racine environnant, il ressemble à ceci:

Hello <strong>There</strong> 
<div>I think <em>I am</em> feeing better!</div> 
<div>Don't you?</div> 
Yup! 

J'ai essayé d'utiliser lxml.html comme ceci:

lxml.html.fromstring (fragment_string) .drop_tag()

Mais cela ne me donne "Bonjour", que je suppose mak es sens. De meilleures idées?

Répondre

6

Ceci est un peu étrange dans lxml (ou ElementTree). Il faudrait faire:

def inner_html(el): 
    return (el.text or '') + ''.join(tostring(child) for child in el) 

Notez que lxml (et ElementTree) ne possèdent pas de façon particulière pour représenter un document, sauf ancré avec un seul élément, mais .drop_tag() fonctionnerait comme vous voulez si cela n'a pas été le <div> élément racine.

+0

Cela fonctionne très bien; Merci! Juste pour compléter ceci: def remove_root (html): analysé = lxml.html.fromstring (html) return (parsed.text ou '') + '' .join ([lxml.html.tostring (enfant) pour enfant dans analysé]) –

0

Pour une tâche simple, vous pouvez utiliser regexp comme r'<(.*?)>(.*)</\1>' et obtenir match de # 2 (\ 2 en termes perl) de celui-ci

Vous devez également mettre des drapeaux comme ms pour le multi-ligne correcte de travail

+2

Si vous croyez qu'il est correctement formé, vous pouvez faire 'xml.split ('>', 1) [1] .rsplit ('<', 1) [0]' –

+0

oui, belle astuce – Guard

1

Vous pouvez utiliser le package BeautifulSoup. Pour ce html particulier, je voudrais aller comme ceci:

import BeautifulSoup 

html = """<div> 
    Hello <strong>There</strong> 
    <div>I think <em>I am</em> feeing better!</div> 
    <div>Don't you?</div> 
    Yup! 
</div>""" 

bs = BeautifulSoup.BeautifulSoup(html) 

no_root = '\n'.join(map(unicode, bs.div.contents)) 

BeautifulSoup a de nombreuses fonctionnalités intéressantes qui vous permettront de peaufiner cet exemple pour beaucoup d'autres cas. Documentation complète: http://www.crummy.com/software/BeautifulSoup/documentation.html.

Questions connexes