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 innerhtml
div
: 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?
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.
l'Une des options pourrait être utiliser quelque chose comme ça:
innerhtml = "".join([str(x) for x in div_element.contents])
que diriez-vous simplement unicode(x)
? Semble fonctionner pour moi.
Edit: cela vous donnera le HTML externe et non l'intérieur.
si vous n'avez besoin que du texte (pas de balises HTML), alors vous pouvez utiliser .text
:
soup.select("div").text
eh Bien, vous pourriez utiliser .get_text()
trop pour seulement TEXT
soup.select("div").get_text()