16 votes

Comment transformer <br> et <p> en sauts de ligne ?

Disons que j'ai un HTML avec <p> y <br> tags à l'intérieur. Ensuite, je vais dépouiller le HTML pour nettoyer les balises. Comment puis-je les transformer en sauts de ligne ?

J'utilise l'outil Python BelleSoupe bibliothèque, si ça peut aider.

14voto

Mike Pennington Points 16712

En l'absence de précisions, il est difficile d'être sûr que cela fait exactement ce que vous voulez, mais cela devrait vous donner une idée... cela suppose que vos balises b sont enveloppées dans des éléments p.

from BeautifulSoup import BeautifulSoup
import six

def replace_with_newlines(element):
    text = ''
    for elem in element.recursiveChildGenerator():
        if isinstance(elem, six.string_types):
            text += elem.strip()
        elif elem.name == 'br':
            text += '\n'
    return text

page = """<html>
<body>
<p>America,<br>
Now is the<br>time for all good men to come to the aid<br>of their country.</p>
<p>pile on taxpayer debt<br></p>
<p>Now is the<br>time for all good men to come to the aid<br>of their country.</p>
</body>
</html>
"""

soup = BeautifulSoup(page)
lines = soup.find("body")
for line in lines.findAll('p'):
    line = replace_with_newlines(line)
    print line

En exécutant ceci, on obtient...

(py26_default)[mpenning@Bucksnort ~]$ python thing.py
America,
Now is the
time for all good men to come to the aid
of their country.
pile on taxpayer debt

Now is the
time for all good men to come to the aid
of their country.
(py26_default)[mpenning@Bucksnort ~]$

11voto

naoko Points 739

get_text semble faire ce dont vous avez besoin

>>> from bs4 import BeautifulSoup
>>> doc = "<p>This is a paragraph.</p><p>This is another paragraph.</p>"
>>> soup = BeautifulSoup(doc)
>>> soup.get_text(separator="\n")
u'This is a paragraph.\nThis is another paragraph.'

5voto

Geng Jiawen Points 85

Il s'agit d'une version python3 de la réponse de @Mike Pennington (elle est très utile), j'ai fait une refactorisation légère.

def replace_with_newlines(element):
    text = ''
    for elem in element.recursiveChildGenerator():
        if isinstance(elem, str):
            text += elem.strip()
        elif elem.name == 'br':
            text += '\n'
    return text

def get_plain_text(soup):
    plain_text = ''
    lines = soup.find("body")
    for line in lines.findAll('p'):
        line = replace_with_newlines(line)
        plain_text+=line
    return plain_text

Pour l'utiliser, il suffit de passer l'objet Beautifulsoup à la méthode get_plain_text.

soup = BeautifulSoup(page)
plain_text = get_plain_text(soup)

1voto

Jean Monet Points 621

J'utilise la petite bibliothèque suivante pour y parvenir :

https://github.com/TeamHG-Memex/html-text

pip install html-text

Aussi simple que ça :

>>> import html_text
>>> html_text.extract_text('<h1>Hello</h1> world!')
'Hello\n\nworld!'

-6voto

Андрей Points 177

Je ne suis pas tout à fait sûr de ce que vous essayez d'accomplir, mais si vous essayez simplement de supprimer les éléments HTML, j'utiliserais un programme tel que Bloc-notes2 et utilisez la fonction Remplacer tout - je pense que vous pouvez également insérer une nouvelle ligne en utilisant Remplacer tout. Assurez-vous que si vous remplacez le <p> que vous supprimez également la fermeture ( </p> ). En outre, pour votre information, le bon HTML5 est le suivant <br /> au lieu de <br> mais ça n'a pas vraiment d'importance. Python ne serait pas mon premier choix pour cela, donc c'est un peu en dehors de mon domaine de connaissance, désolé de ne pas pouvoir vous aider davantage.

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