Konvertieren Sie XML/HTML-Entitäten in Python in Unicode-Strings [duplicate]

Lesezeit: 5 Minuten

Konvertieren Sie XMLHTML Entitaten in Python in Unicode Strings duplicate
Christian

Ich mache Web-Scraping und Websites verwenden häufig HTML-Entitäten, um Nicht-ASCII-Zeichen darzustellen. Verfügt Python über ein Dienstprogramm, das eine Zeichenfolge mit HTML-Entitäten akzeptiert und einen Unicode-Typ zurückgibt?

Zum Beispiel:

Ich komme zurück:

ǎ

was ein “ǎ” mit einem Tonzeichen darstellt. In binärer Form wird dies als 16-Bit-01ce dargestellt. Ich möchte die HTML-Entität in den Wert konvertieren u'\u01ce'

  • verwandt: HTML-Entitäten in Python-String dekodieren?

    – jfs

    2. Februar 2016 um 8:36 Uhr

Konvertieren Sie XMLHTML Entitaten in Python in Unicode Strings duplicate
Wladislav

Der eigene HTMLParser der Standardbibliothek hat eine undokumentierte Funktion unescape(), die genau das tut, was Sie denken:

bis Python 3.4:

import HTMLParser
h = HTMLParser.HTMLParser()
h.unescape('© 2010') # u'\xa9 2010'
h.unescape('© 2010') # u'\xa9 2010'

Python 3.4+:

import html
html.unescape('© 2010') # u'\xa9 2010'
html.unescape('© 2010') # u'\xa9 2010'

  • es funktioniert auch für Hex-Entitäten. Die Die Umsetzung ist sehr ähnlich to unescape() Funktion aus der Antwort von @dF.

    – jfs

    2. Oktober 2012 um 21:26 Uhr

  • Diese Methode ist nicht in der HTMLParser-Dokumentation von Python dokumentiert, und es gibt einen Kommentar in der Quelle, der besagt, dass sie für den internen Gebrauch bestimmt ist. Es funktioniert jedoch wie Treat in Python 2.6 bis 2.7 und ist wahrscheinlich die beste Lösung auf dem Markt. Vor Version 2.6 wurden nur benannte Entitäten wie dekodiert & oder >.

    – Aram Dulyan

    17. Oktober 2012 um 0:34 Uhr

  • Es ist als ausgesetzt html.unescape() Funktion in Python 3.4+

    – jfs

    7. Oktober 2014 um 19:23 Uhr

  • Diese Erhöhung UnicodeDecodeError mit UTF-8 Saiten. Sie müssen entweder decode('utf-8') es zuerst oder verwenden xml.sax.saxutils.unescape.

    – Stan

    7. Oktober 2016 um 12:55 Uhr

1646176928 749 Konvertieren Sie XMLHTML Entitaten in Python in Unicode Strings duplicate
dF.

Python hat die htmlentitydefs -Modul, aber dies enthält keine Funktion zum Aufheben der Escape-Zeichen für HTML-Entitäten.

Eine solche Funktion hat der Python-Entwickler Fredrik Lundh (u. a. Autor von elementtree). auf seiner Websitedas mit dezimalen, hexadezimalen und benannten Entitäten funktioniert:

import re, htmlentitydefs

##
# Removes HTML or XML character references and entities from a text string.
#
# @param text The HTML (or XML) source text.
# @return The plain text, as a Unicode string, if necessary.

def unescape(text):
    def fixup(m):
        text = m.group(0)
        if text[:2] == "&#":
            # character reference
            try:
                if text[:3] == "&#x":
                    return unichr(int(text[3:-1], 16))
                else:
                    return unichr(int(text[2:-1]))
            except ValueError:
                pass
        else:
            # named entity
            try:
                text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
            except KeyError:
                pass
        return text # leave as is
    return re.sub("&#?\w+;", fixup, text)

  • Absolut. Warum nicht in stdlib?

    – smci

    13. August 2012 um 11:21 Uhr

  • Wenn man sich den Code ansieht, scheint es nicht zu funktionieren & und so, oder?

    – jnns

    14. Juni 2013 um 12:22 Uhr

  • Gerade erfolgreich getestet für &

    – joel.d

    30. September 2013 um 20:50 Uhr

Verwenden Sie die integrierte unichr – BeautifulSoup ist nicht erforderlich:

>>> entity = '&#x01ce'
>>> unichr(int(entity[3:],16))
u'\u01ce'

  • Aber dazu müssen Sie automatisch und eindeutig wissen, wo in der Zeichenfolge sich das codierte Unicode-Zeichen befindet/befinden – was Sie nicht wissen können. Und das müssen Sie try...catch die resultierende Ausnahme, wenn Sie es falsch machen.

    – smci

    13. August 2012 um 11:22 Uhr


  • unichar wurde in python3 entfernt. Irgendwelche Vorschläge für diese Version?

    – Stefan Collier

    30. Januar 2018 um 15:31 Uhr

1646176929 81 Konvertieren Sie XMLHTML Entitaten in Python in Unicode Strings duplicate
Markus Amalthea Magnuson

Wenn Sie Python 3.4 oder neuer verwenden, können Sie einfach die verwenden html.unescape:

import html

s = html.unescape(s)

1646176930 792 Konvertieren Sie XMLHTML Entitaten in Python in Unicode Strings duplicate
pragmatisch

Eine Alternative, wenn Sie lxml haben:

>>> import lxml.html
>>> lxml.html.fromstring('&#x01ce').text
u'\u01ce'

  • Seien Sie jedoch vorsichtig, da dies auch ein Objekt vom Typ zurückgeben kann str wenn kein Sonderzeichen vorhanden ist.

    – Pintoch

    20. Oktober 2014 um 20:02 Uhr

  • beste lösung wenn alles schief geht, kommt nur noch lxml zur rettung. 🙂

    – Mansur Akram

    20. November 2016 um 21:18 Uhr

1646176930 259 Konvertieren Sie XMLHTML Entitaten in Python in Unicode Strings duplicate
Gemeinschaft

Sie könnten hier eine Antwort finden — Internationale Zeichen von einer Webseite abrufen?

BEARBEITEN: Wie es scheint BeautifulSoup konvertiert keine in hexadezimaler Form geschriebenen Entitäten. Es kann behoben werden:

import copy, re
from BeautifulSoup import BeautifulSoup

hexentityMassage = copy.copy(BeautifulSoup.MARKUP_MASSAGE)
# replace hexadecimal character reference by decimal one
hexentityMassage += [(re.compile('&#x([^;]+);'), 
                     lambda m: '&#%d;' % int(m.group(1), 16))]

def convert(html):
    return BeautifulSoup(html,
        convertEntities=BeautifulSoup.HTML_ENTITIES,
        markupMassage=hexentityMassage).contents[0].string

html="<html>&#x01ce;&#462;</html>"
print repr(convert(html))
# u'\u01ce\u01ce'

BEARBEITEN:

unescape() von @dF erwähnte Funktion, die verwendet htmlentitydefs Standardmodul u unichr() könnte in diesem Fall besser geeignet sein.

  • Seien Sie jedoch vorsichtig, da dies auch ein Objekt vom Typ zurückgeben kann str wenn kein Sonderzeichen vorhanden ist.

    – Pintoch

    20. Oktober 2014 um 20:02 Uhr

  • beste lösung wenn alles schief geht, kommt nur noch lxml zur rettung. 🙂

    – Mansur Akram

    20. November 2016 um 21:18 Uhr

Konvertieren Sie XMLHTML Entitaten in Python in Unicode Strings duplicate
karlkow

Dies ist eine Funktion, die Ihnen helfen soll, es richtig zu machen und Entitäten wieder in UTF-8-Zeichen umzuwandeln.

def unescape(text):
   """Removes HTML or XML character references 
      and entities from a text string.
   @param text The HTML (or XML) source text.
   @return The plain text, as a Unicode string, if necessary.
   from Fredrik Lundh
   2008-01-03: input only unicode characters string.
   http://effbot.org/zone/re-sub.htm#unescape-html
   """
   def fixup(m):
      text = m.group(0)
      if text[:2] == "&#":
         # character reference
         try:
            if text[:3] == "&#x":
               return unichr(int(text[3:-1], 16))
            else:
               return unichr(int(text[2:-1]))
         except ValueError:
            print "Value Error"
            pass
      else:
         # named entity
         # reescape the reserved characters.
         try:
            if text[1:-1] == "amp":
               text = "&amp;amp;"
            elif text[1:-1] == "gt":
               text = "&amp;gt;"
            elif text[1:-1] == "lt":
               text = "&amp;lt;"
            else:
               print text[1:-1]
               text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
         except KeyError:
            print "keyerror"
            pass
      return text # leave as is
   return re.sub("&#?\w+;", fixup, text)

  • Warum ist diese Antwort modifiziert? Es scheint mir nützlich zu sein.

    – Dariopie

    25. Februar 2011 um 19:47 Uhr

  • weil die Person das Zeichen in Unicode anstelle von UTF-8-Zeichen haben wollte. Ich schätze 🙂

    – Karlkau

    28. Februar 2011 um 14:41 Uhr

905930cookie-checkKonvertieren Sie XML/HTML-Entitäten in Python in Unicode-Strings [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy