2013-03-25 4 views
9

Ich lerne BeautifulSoup und fand viele „html2text“ Lösungen, aber die, die ich gesucht habe sollte die Formatierung imitieren:Python konvertieren html in Text und Mimik Formatierung

<ul> 
<li>One</li> 
<li>Two</li> 
</ul> 

werden würde

* One 
* Two 

und

Some text 
<blockquote> 
More magnificent text here 
</blockquote> 
Final text 

zu

Some text 

    More magnificent text here 

Final text 

Ich lese die Dokumente, aber ich sehe nichts direktes. Irgendeine Hilfe? Ich bin offen für etwas anderes als beautifulsoup.

+0

Sie wollen etwas, das‘ lch HTML-Tags zu etwas wie Markdown-Format? –

Antwort

9

Werfen Sie einen Blick auf Aaron Swartz html2text Skript (kann mit pip install html2text installiert werden). Beachten Sie, dass die Ausgabe Markdown gültig ist. Wenn aus irgendeinem Grund, dass Sie nicht vollständig entsprechen, einige ziemlich trivial zwickt sollten Sie die genaue Ausgabe in Frage kommen:

In [1]: import html2text 

In [2]: h1 = """<ul> 
    ...: <li>One</li> 
    ...: <li>Two</li> 
    ...: </ul>""" 

In [3]: print html2text.html2text(h1) 
    * One 
    * Two 

In [4]: h2 = """<p>Some text 
    ...: <blockquote> 
    ...: More magnificent text here 
    ...: </blockquote> 
    ...: Final text</p>""" 

In [5]: print html2text.html2text(h2) 
Some text 

> More magnificent text here 

Final text 
+0

Die Beispiele auf seiner eigenen Seite sehen überhaupt nicht benutzerfreundlich aus, wenn man Bilder, Links und vor allem lokale Links betrachtet, die mit/beginnen. Vielleicht brauche ich ein besseres Verständnis von Markdown, aber kannst du ein Beispiel für den vorgeschlagenen Tweak geben? oder wäre das in der html2text-Funktion fest codiert? – Mikhail

+0

@Mikhail - Nicht sicher, ob ich folge - wie möchten Sie die Links, Bilder behandelt werden? – root

+0

Angenommen, Bilder werden ignoriert und Links im Format 'text (link)' erstellt. Seine Website ist im Moment nicht verfügbar, daher kann ich Ihnen keine Details geben. – Mikhail

5

Ich habe Code für eine einfache Aufgabe: HTML-Tags entfernen, und fügen Sie neue Zeilen an die geeigneten Orte. Vielleicht kann dies ein Ausgangspunkt für Sie sein.

Das Python-Modul textwrap kann hilfreich sein, um eingerückte Textblöcke zu erstellen.

http://docs.python.org/2/library/textwrap.html

class HtmlTool(object): 
    """ 
    Algorithms to process HTML. 
    """ 
    #Regular expressions to recognize different parts of HTML. 
    #Internal style sheets or JavaScript 
    script_sheet = re.compile(r"<(script|style).*?>.*?(</\1>)", 
           re.IGNORECASE | re.DOTALL) 
    #HTML comments - can contain ">" 
    comment = re.compile(r"<!--(.*?)-->", re.DOTALL) 
    #HTML tags: <any-text> 
    tag = re.compile(r"<.*?>", re.DOTALL) 
    #Consecutive whitespace characters 
    nwhites = re.compile(r"[\s]+") 
    #<p>, <div>, <br> tags and associated closing tags 
    p_div = re.compile(r"</?(p|div|br).*?>", 
         re.IGNORECASE | re.DOTALL) 
    #Consecutive whitespace, but no newlines 
    nspace = re.compile("[^\S\n]+", re.UNICODE) 
    #At least two consecutive newlines 
    n2ret = re.compile("\n\n+") 
    #A return followed by a space 
    retspace = re.compile("(\n)") 

    #For converting HTML entities to unicode 
    html_parser = HTMLParser.HTMLParser() 

    @staticmethod 
    def to_nice_text(html): 
     """Remove all HTML tags, but produce a nicely formatted text.""" 
     if html is None: 
      return u"" 
     text = unicode(html) 
     text = HtmlTool.script_sheet.sub("", text) 
     text = HtmlTool.comment.sub("", text) 
     text = HtmlTool.nwhites.sub(" ", text) 
     text = HtmlTool.p_div.sub("\n", text) #convert <p>, <div>, <br> to "\n" 
     text = HtmlTool.tag.sub("", text)  #remove all tags 
     text = HtmlTool.html_parser.unescape(text) 
     #Get whitespace right 
     text = HtmlTool.nspace.sub(" ", text) 
     text = HtmlTool.retspace.sub("\n", text) 
     text = HtmlTool.n2ret.sub("\n\n", text) 
     text = text.strip() 
     return text 

Es könnte einige überflüssige reguläre Ausdrücke im Code der linken Seite.

3

Das integrierte html.parser-Modul von Python (HTMLParser in früheren Versionen) kann einfach erweitert werden, um einen einfachen Übersetzer zu erstellen, den Sie genau an Ihre Bedürfnisse anpassen können. Sie können sich in bestimmte Ereignisse einklinken, während der Parser durch den HTML-Code frisst.

Aufgrund seiner einfachen Art können Sie nicht wie bei Beautiful Soup (z. B. Geschwister, Kind, Elternknoten usw.) durch den HTML-Baum navigieren, aber für einen einfachen Fall wie Ihren sollte es ausreichen.

html.parser homepage

In Ihrem Fall könnte man es so verwenden, indem Sie die entsprechende Formatierung hinzugefügt, wenn ein Start-Tag oder End-Tag eines bestimmten Typs angetroffen wird:

from html.parser import HTMLParser 
from os import linesep 

class MyHTMLParser(HTMLParser): 
    def __init__(self): 
     HTMLParser.__init__(self, strict=False) 
    def feed(self, in_html): 
     self.output = "" 
     super(MyHTMLParser, self).feed(in_html) 
     return self.output 
    def handle_data(self, data): 
     self.output += data.strip() 
    def handle_starttag(self, tag, attrs): 
     if tag == 'li': 
      self.output += linesep + '* ' 
     elif tag == 'blockquote' : 
      self.output += linesep + linesep + '\t' 
    def handle_endtag(self, tag): 
     if tag == 'blockquote': 
      self.output += linesep + linesep 

parser = MyHTMLParser() 
content = "<ul><li>One</li><li>Two</li></ul>" 
print(linesep + "Example 1:") 
print(parser.feed(content)) 
content = "Some text<blockquote>More magnificent text here</blockquote>Final text" 
print(linesep + "Example 2:") 
print(parser.feed(content))