BeautifulSoup innerhtml?

disons que j'ai une page avec un div. Je peux facilement obtenir div soup.find().

maintenant que j'ai le résultat, j'aimerais imprimer le tout innerhtmldiv: je veux dire, j'aurais besoin d'une chaîne de caractères avec toutes les balises html et tous les textes ensemble, exactement comme la chaîne que j'obtiendrais en javascript avec obj.innerHTML. Est-ce possible?

33
demandé sur Adam Wagner 2011-11-13 20:26:24

5 réponses

TL;DR

Avec BeautifulSoup 4 utiliser element.encode_contents() si vous voulez une codé en UTF-8 bytestring ou utiliser element.decode_contents() si vous voulez une chaîne Unicode Python. Par exemple, le DOM de la méthode innerHTML pourrait ressembler à quelque chose comme ceci:

def innerHTML(element):
    """Returns the inner HTML of an element as a UTF-8 encoded bytestring"""
    return element.encode_contents()

encode_contents - BeautifulSoup 4.0.4 à 4,6+

ces fonctions ne sont pas actuellement dans la documentation en ligne donc je vais citer la définition actuelle de la fonction encode_contents et la chaîne doc dans le code:

def encode_contents(
    self, indent_level=None, encoding=DEFAULT_OUTPUT_ENCODING,
    formatter="minimal"):
    """Renders the contents of this tag as a bytestring.

    :param indent_level: Each line of the rendering will be
       indented this many spaces.

    :param encoding: The bytestring will be in this encoding.

    :param formatter: The output formatter responsible for converting
       entities to Unicode characters.
    """

Voir aussi documentation sur des formateurs; vous aurez plus de chances de soit utiliser formatter="minimal" (par défaut) ou formatter="html" (pour entités html), sauf si vous voulez traiter manuellement le texte d'une certaine façon.

encode_contents renvoie un bytestring encodé. Si vous voulez une chaîne Unicode Python, utilisez decode_contents à la place (voir la section suivante).


decode_contents - BeautifulSoup 4.0.1 pour 4.6+

decode_contents fait la même chose que encode_contents mais renvoie une chaîne Unicode Python au lieu d'une bytestring encodée. Voici ce que le code a à dire:

def decode_contents(self, indent_level=None,
                   eventual_encoding=DEFAULT_OUTPUT_ENCODING,
                   formatter="minimal"):
    """Renders the contents of this tag as a Unicode string.

    :param indent_level: Each line of the rendering will be
       indented this many spaces.

    :param eventual_encoding: The tag is destined to be
       encoded into this encoding. This method is _not_
       responsible for performing that encoding. This information
       is passed in so that it can be substituted in if the
       document contains a <META> tag that mentions the document's
       encoding.

    :param formatter: The output formatter responsible for converting
       entities to Unicode characters.
    """

BeautifulSoup 3

BeautifulSoup 3 n'a pas les fonctions ci-dessus, à la place il a renderContents

def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
                   prettyPrint=False, indentLevel=0):
    """Renders the contents of this tag as a string in the given
    encoding. If encoding is None, returns a Unicode string.."""

cette fonction a été ajoutée de nouveau à BeautifulSoup 4 (en 4.0.4) pour la compatibilité avec BS3.

37
répondu ChrisD 2018-04-08 15:45:25

l'Une des options pourrait être utiliser quelque chose comme ça:

 innerhtml = "".join([str(x) for x in div_element.contents]) 
11
répondu peewhy 2011-11-13 16:39:31

que diriez-vous simplement unicode(x)? Semble fonctionner pour moi.

Edit: cela vous donnera le HTML externe et non l'intérieur.

1
répondu Michael Litvin 2017-10-24 12:52:20

si vous n'avez besoin que du texte (pas de balises HTML), alors vous pouvez utiliser .text:

soup.select("div").text
1
répondu Pikamander2 2017-11-18 10:31:44

eh Bien, vous pourriez utiliser .get_text() trop pour seulement TEXT

soup.select("div").get_text()
0
répondu Kogam22 2018-06-20 17:28:46