Wie konvertiere ich HTML-Entitäten in lesbaren Text?

9

Ich möchte HTML-Zahlenentitäten wie & # x119; und möchte es in echten Charakter umwandeln. Ich habe hauptsächlich E-Mails von LinkedIn, die so aussehen:

chcia & # x142; abym zapyta & # x107;, czy rozwa & # x17c; a Pan takze udzia & # x142; w nowych projektach w Warszawie? Obecnie poszukujemy specjalisty javascript / architekta z bardzo dobr & # x105; znajomo & # x15b; ci & # x105; Angular.js do projektu, kt & # xf3; ry dotyczy systemu, s & # x142; u & # x17c; & # x105; cego do monitorowania i zarz & # x105; dzania flot & # x105; pojazd & # xf3; w. Zesp & # xf3; & # x142;, do kt & # xf3; rego poszukujemy

Ich benutze clawsmail, wechsle zu HTML, konvertiere es nicht in Text, ich habe versucht zu kopieren und zu verwenden

xclip -o -sel clip | html2text | less

aber es hat die Entitäten nicht konvertiert. Gibt es eine Möglichkeit, diesen Text mithilfe von Befehlszeilentools zu erstellen?

Ich kann mir nur data:text/html,<PASTE THE EMAIL>vorstellen, es in einem Browser zu verwenden und zu öffnen, würde aber die Befehlszeile bevorzugen.

jcubic
quelle

Antworten:

20

Mit Free recode(früher bekannt als GNU recode):

recode html < file

Wenn Sie keine Entitäten haben recodeoder HTML::Entitiesnur dekodieren müssen &#x<hex>;, können Sie dies von Hand tun mit:

perl -Mopen=locale -pe 's/&#x([\da-f]+);/chr hex $1/gie'
Stéphane Chazelas
quelle
diese Arbeit perfektc-v | html2text | recode html
jcubic
Hatte nicht html2text; Ich bin mir nicht sicher, ob es darauf ankommt. Dieses Beispiel schlägt mit fehl recode: Request 'html' is erroneous. Es scheint, dass es jetzt auf diese Weise mit einem Bereich anstelle eines einzelnen Bezeichners ausgeführt werden muss : recode html..utf-8. Ein bisschen seltsam, aber ich denke, es ist alles ähnlich, Codes auf einigen Ebenen zu übersetzen.
Pysis
@Pysis, Sie werden feststellen, dass die erste Version dieser Antwort html..später auf html2014 geändert wurde. htmlAllein funktioniert definitiv mit der neuesten Version (Git Head von Dezember 2019) oder von 3.6 von 2008. Ist es möglich, dass Sie eine sehr alte Version haben?
Stéphane Chazelas
Gerade installiert, um in Cygwin zu verwenden, ich denke, es war von Choco? recode 3.7-beta2
Pysis
Mit recode 3.7-beta2 funktioniert derzeit der Befehl recode HTML..utf-8.
Diomidis Spinellis
4

Von Wie kann ich HTML-Entitäten dekodieren? In StackOverflow können Sie möglicherweise eine einfache Perl-Lösung implementieren, z

perl -Mopen=locale -MHTML::Entities -pe '$_ = decode_entities($_)' email.txt

zB mit Ihrem Beispieltext

$ perl -Mopen=locale -MHTML::Entities -pe '$_ = decode_entities($_)' email.txt
chciałabym zapytać, czy rozważa Pan takze udział w nowych projektach w Warszawie ? Obecnie poszukujemy specjalisty javascript/architekta z bardzo dobrą znajomością Angular.js do projektu, który dotyczy systemu, służącego do monitorowania i zarządzania flotą pojazdów. Zespół, do którego poszukujemy

Mit -Mopen=localewird die E / A im Zeichensatz des Gebietsschemas ausgeführt. Das schließt Eingaben von ein email.txt. Es sieht so aus, als ob es email.txtnur ASCII-Zeichen enthält (der ganze Punkt, an dem diese Zeichen mit der &#x<hex>;Notation codiert werden, nehme ich an), aber wenn nicht, müssen Sie möglicherweise das Obige anpassen, um diese Datei auch mit dem richtigen Zeichensatz zu decodieren (wenn es nicht mit dem Gebietsschema identisch ist) eins) anstatt zu verwenden open=locale.

Steeldriver
quelle
2
Sie sollten die -Mopen=localeOption verwenden, damit der Text im Zeichensatz des Benutzers ausgegeben wird (und diese Warnung verschwinden lässt).
Stéphane Chazelas
3

Eine Python 3.2+ -Version kann in einer Pipe verwendet werden:

python3 -c 'import html, sys; [print(html.unescape(l), end="") for l in sys.stdin]' < file
Aissen
quelle
Reiniger:python3 -c'import html,sys;print(html.unescape(sys.stdin.read()), end="")'
Ariddell
@ariddell: Ihre Version ist nicht zeilenweise und ich wollte die Zeilengrenzen beibehalten. Andernfalls blockiert es eine Pipe, bis alles auf stdin gelesen wird (Pipe ist erschöpft).
Aissen
-1

echo -e "\x01\x19" sollte den Trick machen.

doneal24
quelle
aufstehen Stimmen sollten Sie wahrscheinlich Shell - Code schreiben, konvertiert &#x119;zu echo -e "\x01\x19"möglich sein sollte , mit sed.
Jcubic
Auch das funktioniert nicht, weil es ein Charakter ist und ich es nicht bekomme, wenn ich Ihren Befehl ausführe.
Jcubic
Es funktioniert, aber ich bin nicht in der Lage, es mit sed zum Laufen zu bringen. Bisher habe ichc-v | sed -e 's/&#x\([^;]*\);/\\u\1/g' -e 's/.*/echo -e "&"/' | bash
jcubic