14 Stimmen

HTML-Einrücker in Python geschrieben

Ich bin auf der Suche nach einem freien (wie in Freiheit) HTML-Indenter (oder re-indenter) geschrieben in Python (Modul oder Kommandozeile). Ich muss HTML nicht mit einer Whitelist filtern. Ich möchte lediglich den HTML-Quelltext einrücken (oder neu einrücken), um ihn besser lesbar zu machen. Ein Beispiel: Ich habe den folgenden Code:

<ul><li>Item</li><li>Item
</li></ul>

könnte die Ausgabe etwa so aussehen:

<ul>
    <li>Item</li>
    <li>Item</li>
</ul>

Hinweis: Ich bin nicht auf der Suche nach einer Schnittstelle zu einer Nicht-Python-Software (z. B. Tidy, geschrieben in C), sondern nach einem 100%igen Python-Skript.

Herzlichen Dank.

8voto

Elisha Punkte 4463

Können Sie das eingebaute Modul verwenden xml.dom.minidom 's toprettyxml Funktion:

>>> from xml.dom import minidom
>>> x = minidom.parseString("<ul><li>Item</li><li>Item\n</li></ul>")
>>> print x.toprettyxml()
<?xml version="1.0" ?>
<ul>
    <li>
        Item
    </li>
    <li>
        Item
    </li>
</ul>

7voto

Guy Hoozdis Punkte 111

BeautifulSoup verwenden

Es gibt ein Dutzend Möglichkeiten, das BeautifulSoup-Modul und seine "prettify"-Funktion zu nutzen. Hier sind einige Beispiele, die Ihnen den Einstieg erleichtern.

Über die Befehlszeile

$ python -m BeautifulSoup < somefile.html > prettyfile.html

Innerhalb von VIM (manuell)

Sie müssen die Datei nicht auf die Festplatte zurückschreiben, wenn Sie das nicht wollen, aber ich habe den Schritt eingefügt, der den gleichen Effekt wie das Kommandozeilenbeispiel hat.

$ vi somefile.html
:!python -m BeautifulSoup < %
:w prettyfile.html

Innerhalb von VIM (Schlüsselzuordnung definieren)

In ~/.vimrc definieren:

nmap =h !python -m BeautifulSoup < %<CR>

Wenn Sie dann eine Datei in vim öffnen und sie verschönert werden muss

$vi somefile.html
=h
:w prettyfile.html

Auch hier ist die Speicherung der Verschönerungsmaßnahmen optional.

Python-Shell

$ python
>>> from BeautifulSoup import BeautifulSoup as parse_html_string
>>> from os import path
>>> uglyfile = path.abspath('somefile.html')
>>> path.isfile(uglyfile)
True
>>> prettyfile = path.abspath(path.join('.', 'prettyfile.html'))
>>> path.exists(prettyfile)
>>> doc = None
>>> with open(uglyfile, 'r') as infile, open(prettyfile, 'w') as outfile:
...     # Assuming very simple case
...     htmldocstr = infile.read()
...     doc = parse_html_string(htmldocstr)
...     outfile.write(doc.prettify())

# That's it; you can manually manipulate the dom too though
>>> scripts = doc.findAll('script')
>>> meta = doc.findAll('meta')
>>> print doc.prettify()
[imagine beautiful html here]

>>> import jsbeautifier
>>> print jsbeautifier.beautify(script.string)
[imagine beautiful script here]
>>>

4voto

thdoan Punkte 17054

Außerdem gibt es die html5druck Modul. Die wichtigsten Merkmale auf der Beschreibungsseite:

  • Hübsches Druck-HTML sowie darin eingebettetes CSS und JavaScript
  • Pretty print rein CSS und JavaScript
  • Versuchen Sie, fragmentiertes HTML5 zu reparieren
  • Versuch, HTML mit defekter Unicode-Kodierung zu reparieren
  • Versucht, die Kodierung des Dokuments zu erraten, und schafft es in einigen Fällen, 8-Bit-Byte-Code in das korrekte UTF-8-Format umzuwandeln
  • Unterstützt sowohl Python 2 als auch 3

3voto

Uku Loskit Punkte 39240

BeautifulSoup hat eine Funktion namens prettify die dies tut. Siehe diese Frage

1voto

emehex Punkte 8374

Hier ist meine reine Python-Lösung:

from xml.dom.minidom import parseString as string_to_dom

def prettify(string, html=True):
    dom = string_to_dom(string)
    ugly = dom.toprettyxml(indent="  ")
    split = list(filter(lambda x: len(x.strip()), ugly.split('\n')))
    if html:
        split = split[1:]
    pretty = '\n'.join(split)
    return pretty

def pretty_print(html):
    print(prettify(html))

Bei Verwendung in Ihrem Html-Block:

html = """<ul><li>Item</li><li>Item</li></ul>"""
pretty_print(html)

Ich verstehe:

<ul>
  <li>Item</li>
  <li>Item</li>
</ul>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X