web-dev-qa-db-fra.com

Python: existe-t-il un package intégré pour analyser le code HTML dans dom

J'ai trouvé HTMLParser pour sax et xml.minidom pour xml. J'ai un html assez bien formé donc je n'ai pas besoin d'un analyseur trop fort - des suggestions?

39
Guy

Jetez un oeil à BeautifulSoup . Il est populaire et excellent pour analyser HTML.

12
Bartosz

Je recommanderais lxml . J'aime BeautifulSoup, mais il y a généralement des problèmes de maintenance et des problèmes de compatibilité avec les versions ultérieures. Je suis content d'utiliser lxml.


Plus tard: les meilleures recommandations sont d'utiliser lxml, html5lib ou BeautifulSoup 3.0.8. BeautifulSoup 3.1.x est destiné à python 3.x et est connu pour avoir des problèmes avec les versions antérieures python, comme indiqué sur le site Web BeautifulSoup .

Ian Bicking a un bon article sur l'utilisation de lxml.

ElementTree est une autre recommandation, mais je ne l'ai jamais utilisée.


2012-01-18: quelqu'un est venu et a décidé de downvote moi et Bartosz parce que nous avons recommandé python packages qui sont facilement obtenus mais ne font pas partie du python Donc, pour les StackOverflowers très littéraux: "Vous pouvez utiliser xml.dom.minidom, mais personne ne le recommandera plutôt que les alternatives."

25
hughdbrown

BeautifulSoup et lxml sont excellents, mais les réponses ne sont pas appropriées ici car la question concerne les prédéfinis. Voici un exemple d'utilisation du module intégré minidom pour analyser une chaîne HTML. Testé avec cPython 3.5.2:

from xml.dom.minidom import parseString

html_string = """
<!DOCTYPE html>
<html><head><title>title</title></head><body><p>test</p></body></html>
"""

# extract the text value of the document's <p> tag:
doc = parseString(html_string)
paragraph = doc.getElementsByTagName("p")[0]
content = paragraph.firstChild.data

print(content)

Cependant, comme indiqué dans Jesse Hogan comment , cela échouera sur les entités HTML non reconnues par mindom. Voici une solution mise à jour utilisant le module Python3 html.parser:

from html.parser import HTMLParser

html_string = """
<!DOCTYPE html>
<html><head><title>title</title></head><body><p>&nbsp;test</p><div>not in p</div></body></html>
"""

class Parser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.in_p = []

    def handle_starttag(self, tag, attrs):
        if (tag == 'p'):
            self.in_p.append(tag)

    def handle_endtag(self, tag):
        if (tag == 'p'):
            self.in_p.pop()

    def handle_data(self, data):
        if self.in_p:
            print("<p> data :", data)

parser = Parser()
parser.feed(html_string)
18
Joseph Sheedy

Pour gérer les objets DOM, vous pouvez utiliser HTMLDOM pour python.

3
delta24