66 votes

BeatifulSoup innerhtml?

Disons que j'ai une page avec une balise div. Je peux facilement obtenir cette div avec soup.find().

Maintenant que j'ai le résultat, j'aimerais imprimer le innerhtml COMPLET de cette div : je veux dire, j'aurais besoin d'une chaîne avec TOUS les balises html et le texte tous réunis, exactement comme la chaîne que je pourrais obtenir en javascript avec obj.innerHTML. Est-ce possible ?

1voto

Praveen Kumar Points 51

La manière la plus simple est d'utiliser la propriété children.

inner_html = soup.find('body').children

cela renverra une liste. Ainsi, vous pouvez obtenir le code complet en utilisant une simple boucle for.

for html in inner_html:
    print(html)

1voto

BSimjoo Points 149

Si je ne me trompe pas, vous voulez dire que pour un exemple comme celui-ci :

    text in body
    Hello World!

la sortie devrait ressembler à ceci :

text in body
    Hello World!

Voici votre réponse :

''.join(map(str,tag.contents))

-4voto

Yahyaa Points 99

Pour juste du texte, Beautiful Soup 4 get_text()

Si vous ne voulez que le texte lisible par l'homme à l'intérieur d'un document ou d'une balise, vous pouvez utiliser la méthode get_text(). Elle retourne tout le texte dans un document ou sous une balise, sous forme d'une seule chaîne Unicode :

markup = '\nI linked to example.com\n'
soup = BeautifulSoup(markup, 'html.parser')

soup.get_text()
'\nI linked to example.com\n'
soup.i.get_text()
'example.com' 

Vous pouvez spécifier une chaîne à utiliser pour joindre les morceaux de texte ensemble :

soup.get_text("|")
'\nI linked to |example.com|\n' 

Vous pouvez dire à Beautiful Soup de supprimer les espaces blancs du début et de la fin de chaque morceau de texte :

soup.get_text("|", strip=True)
'I linked to|example.com' 

Mais à ce stade, vous voudrez peut-être utiliser le générateur .stripped_strings à la place, et traiter le texte vous-même :

[text for text in soup.stripped_strings]
# ['I linked to', 'example.com'] 

À partir de la version 4.9.0 de Beautiful Soup, lorsque lxml ou html.parser sont utilisés, le contenu des balises </code>, <code><style></code> et <code><template></code> n'est pas considéré comme du <code>'texte'</code>, car ces balises ne font pas partie du contenu visible de la page pour les humains.</p> <p>Référez-vous ici : <a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/#get-text" rel="nofollow noreferrer">https://www.crummy.com/software/BeautifulSoup/bs4/doc/#get-text</a></p></x-turndown>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X