Skip to content

Instantly share code, notes, and snippets.

@mvtango
Last active February 27, 2020 11:52
Show Gist options
  • Save mvtango/6f03d5a33524306ba4f52b08a983ad19 to your computer and use it in GitHub Desktop.
Save mvtango/6f03d5a33524306ba4f52b08a983ad19 to your computer and use it in GitHub Desktop.
Fix <div> inside of <p> for livebridge

Fix <div> inside of <p> for livebridge

Liveblog gives you broken HTML. Here's how to fix it.

Dependencies

  • beautifulsoup

Files:

sanitize.py - exports function strip_div_in_p, to be used in a livebridge plugin converter.

test_sanitize.py, html_sanitize_tests.json - to add to the tests/ directory.

[{"source": "<p><div><div><b>Das wird heute in Deutschland &amp; der Welt wichtig:</b></div><div><b><br></b></div><div><div><br> &bull; Das <b>Bundesverfassungsgericht</b> verk\u00fcndet sein <b>Urteil zum Verbot</b> der <b>gesch\u00e4ftsm\u00e4\u00dfigen Sterbehilfe</b>.<br> &bull; Inmitten der <b>CDU-F\u00fchrungskrise</b> und unter dem Eindruck des Anschlags von Hanau wenden sich<b> Deutschlands Spitzenpolitiker</b> am <b>politischen Aschermittwoch</b> an ihre Basis.<br> &bull; Der <b>Opel-Mutterkonzern PSA</b> legt seine <b>Gesch\u00e4ftszahlen </b>f\u00fcr das vergangene Jahr vor.<br><br> &bull; In der <b>Champions League</b> spielen Real Madrid gegen Manchester City und Olympique Lyon gegen Juventus Turin.<br> &bull; Zu seinem <b>50-j\u00e4hrigen B\u00fchnenjubil\u00e4um</b> startet der Rockmusiker <b>Peter Maffay</b> in Kiel eine <b>Jubil\u00e4umstournee</b>.<br><br></div></div></div></p>", "target": "<p><b>Das wird heute in Deutschland &amp; der Welt wichtig:</b><b><br/></b><br/> \u2022 Das <b>Bundesverfassungsgericht</b> verk\u00fcndet sein <b>Urteil zum Verbot</b> der <b>gesch\u00e4ftsm\u00e4\u00dfigen Sterbehilfe</b>.<br/> \u2022 Inmitten der <b>CDU-F\u00fchrungskrise</b> und unter dem Eindruck des Anschlags von Hanau wenden sich<b> Deutschlands Spitzenpolitiker</b> am <b>politischen Aschermittwoch</b> an ihre Basis.<br/> \u2022 Der <b>Opel-Mutterkonzern PSA</b> legt seine <b>Gesch\u00e4ftszahlen </b>f\u00fcr das vergangene Jahr vor.<br/><br/> \u2022 In der <b>Champions League</b> spielen Real Madrid gegen Manchester City und Olympique Lyon gegen Juventus Turin.<br/> \u2022 Zu seinem <b>50-j\u00e4hrigen B\u00fchnenjubil\u00e4um</b> startet der Rockmusiker <b>Peter Maffay</b> in Kiel eine <b>Jubil\u00e4umstournee</b>.<br/><br/></p>"}, {"source": "<p><div><div><div><b>Aus Bayern: FC Bayern-Profi Coman muss nach Zerrung nur kurz pausieren&nbsp;</b></div><br>Bayern-Profi <b>Kingsley Coman</b> hat sich beim 3:0-Sieg im <b>Achtelfinal-Hinspiel der Champions League</b> beim FC Chelsea eine <b>leichte Zerrung zugezogen</b>. Nach Angaben des deutschen Fu\u00dfball-Rekordmeisters muss der Franzose <b>\"f\u00fcnf Tage pausieren\"</b>. Coman war in der <b>66. Minute ausgewechselt</b> worden. Damit wird der 23-J\u00e4hrige in der <b>Bundesliga</b> am Samstag bei der TSG 1899 Hoffenheim <b>definitiv fehlen</b>, k\u00f6nnte aber im <b>DFB-Pokal </b>am Dienstag beim FC Schalke 04 <b>wieder zum Einsatz kommen</b>.</div></div></p><div id=\"_jv3sspjxi\">\n <blockquote class=\"twitter-tweet\">\n <p>\nKingsley #Coman zog sich gl\u00fccklicherweise keine schwerwiegendere Verletzung zu. \"Er hat eine leichte Zerrung und wird etwa f\u00fcnf Tage pausieren\", sagte Trainer Hansi #Flick auf der anschlie\u00dfenden Pressekonferenz. \u27a1 https://t.co/x0TQLpeuCH #CFCFCB\n </p>\u2014 \n FC Bayern M\u00fcnchen on Twitter (@fcbayern)\n <a href=\"https://twitter.com/FCBayern/status/1232434993378549761\">https://twitter.com/FCBayern/status/1232434993378549761</a>\n </blockquote>\n</div>", "target": "<p><b>Aus Bayern: FC Bayern-Profi Coman muss nach Zerrung nur kurz pausieren\u00a0</b><br/>Bayern-Profi <b>Kingsley Coman</b> hat sich beim 3:0-Sieg im <b>Achtelfinal-Hinspiel der Champions League</b> beim FC Chelsea eine <b>leichte Zerrung zugezogen</b>. Nach Angaben des deutschen Fu\u00dfball-Rekordmeisters muss der Franzose <b>\"f\u00fcnf Tage pausieren\"</b>. Coman war in der <b>66. Minute ausgewechselt</b> worden. Damit wird der 23-J\u00e4hrige in der <b>Bundesliga</b> am Samstag bei der TSG 1899 Hoffenheim <b>definitiv fehlen</b>, k\u00f6nnte aber im <b>DFB-Pokal </b>am Dienstag beim FC Schalke 04 <b>wieder zum Einsatz kommen</b>.</p><div id=\"_jv3sspjxi\">\n<blockquote class=\"twitter-tweet\">\n<p>\nKingsley #Coman zog sich gl\u00fccklicherweise keine schwerwiegendere Verletzung zu. \"Er hat eine leichte Zerrung und wird etwa f\u00fcnf Tage pausieren\", sagte Trainer Hansi #Flick auf der anschlie\u00dfenden Pressekonferenz. \u27a1 https://t.co/x0TQLpeuCH #CFCFCB\n </p>\u2014 \n FC Bayern M\u00fcnchen on Twitter (@fcbayern)\n <a href=\"https://twitter.com/FCBayern/status/1232434993378549761\">https://twitter.com/FCBayern/status/1232434993378549761</a>\n</blockquote>\n</div>"}, {"source": "<p><div><div><b>Baden-W\u00fcrttemberg und Bayern fordern eine Unternehmenssteuerreform</b><br></div><br><div>Baden-W\u00fcrttemberg und Bayern wollen eine <b>Unternehmenssteuerreform </b>anschieben. Einen entsprechenden Antrag wollen die beiden Bundesl\u00e4nder am morgigen Donnerstag <b>bei der Sitzung des Wirtschaftsausschusses des Bundesrates einreichen</b>. Die Chancen, dass die L\u00e4nderkammer dem folgt, sind ungewiss. Bislang gebe es dazu <b>unterschiedliche Signale</b>. Aus dem Wirtschaftsministerium in Stuttgart hei\u00dft es:</div></div></p><blockquote>Es ist dringend an der Zeit, nationale steuerpolitische Ma\u00dfnahmen zu ergreifen, um im internationalen Steuerwettbewerb nicht noch weiter zur\u00fcckzufallen.<br><br> &bull; <i>Die CDU-Politikerin und Baden-W\u00fcrttembergs Wirtschaftsministerin Nicole Hoffmeister-Kraut.\u00a0</i></blockquote><div><img src=\"https://dpa.liveblog.pro/dpa/20200226060240/a7de8b0622804e2e80529216c720cc6b66d84dd6ffa5f5b52708e7843d0a8ed9.jpg\" /><br>Nicole Hoffmeister-Kraut w\u00e4hrend einer Pressekonferenz mit Winfried Kretschmann, Ministerpr\u00e4sident von Baden-W\u00fcrttemberg. Foto:\u00a0Marijan Murat/dpa/Archiv </div>", "target": "<p><b>Baden-W\u00fcrttemberg und Bayern fordern eine Unternehmenssteuerreform</b><br/><br/>Baden-W\u00fcrttemberg und Bayern wollen eine <b>Unternehmenssteuerreform </b>anschieben. Einen entsprechenden Antrag wollen die beiden Bundesl\u00e4nder am morgigen Donnerstag <b>bei der Sitzung des Wirtschaftsausschusses des Bundesrates einreichen</b>. Die Chancen, dass die L\u00e4nderkammer dem folgt, sind ungewiss. Bislang gebe es dazu <b>unterschiedliche Signale</b>. Aus dem Wirtschaftsministerium in Stuttgart hei\u00dft es:</p><blockquote>Es ist dringend an der Zeit, nationale steuerpolitische Ma\u00dfnahmen zu ergreifen, um im internationalen Steuerwettbewerb nicht noch weiter zur\u00fcckzufallen.<br/><br/> \u2022 <i>Die CDU-Politikerin und Baden-W\u00fcrttembergs Wirtschaftsministerin Nicole Hoffmeister-Kraut.\u00a0</i></blockquote><div><img src=\"https://dpa.liveblog.pro/dpa/20200226060240/a7de8b0622804e2e80529216c720cc6b66d84dd6ffa5f5b52708e7843d0a8ed9.jpg\"/><br/>Nicole Hoffmeister-Kraut w\u00e4hrend einer Pressekonferenz mit Winfried Kretschmann, Ministerpr\u00e4sident von Baden-W\u00fcrttemberg. Foto:\u00a0Marijan Murat/dpa/Archiv </div>"}, {"source": "<p><div><div>Die&nbsp;<b>Top-News</b>&nbsp;aus der&nbsp;<b>Nacht&nbsp;</b>und&nbsp;<b>vom Morgen&nbsp;zum Anh\u00f6ren</b>&nbsp;<i>(Stand: 05:00 Uhr)</i>:</div></div></p><script type=\"text/javascript\">\n\n\u00a0\u00a0\u00a0\nwindow.addEventListener('message',function(_evt) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if\n(_evt.data.sentinel == 'dpa-liveblog') {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\nif(document.querySelector(\"iframe[src*='\"+_evt.data.src+\"']\"))\n{\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\ndocument.querySelector(\"iframe[src*='\"+_evt.data.src+\"']\").style.height\n= _evt.data.height+'px';\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n}\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0 });\n\n</script>\n\n&nbsp;\n\n<iframe src=\"https://dpa-addons.s3.eu-west-1.amazonaws.com/items/audio/liveblog/index.html?audio=\nhttps://dl.dropbox.com/s/h66psagh1n0kdci/4669_Nachrichten_05.64501463.mp3\" scrolling=\"no\" marginheight=\"0\" frameborder=\"0\" allowfullscreen=\"\" style=\"width: 100%; max-width: 100%; border:\nnone;\"></iframe>", "target": "<p>Die\u00a0<b>Top-News</b>\u00a0aus der\u00a0<b>Nacht\u00a0</b>und\u00a0<b>vom Morgen\u00a0zum Anh\u00f6ren</b>\u00a0<i>(Stand: 05:00 Uhr)</i>:</p><script type=\"text/javascript\">\n\n\u00a0\u00a0\u00a0\nwindow.addEventListener('message',function(_evt) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if\n(_evt.data.sentinel == 'dpa-liveblog') {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\nif(document.querySelector(\"iframe[src*='\"+_evt.data.src+\"']\"))\n{\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\ndocument.querySelector(\"iframe[src*='\"+_evt.data.src+\"']\").style.height\n= _evt.data.height+'px';\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n}\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0 });\n\n</script>\n\n\u00a0\n\n<iframe allowfullscreen=\"\" frameborder=\"0\" marginheight=\"0\" scrolling=\"no\" src=\"https://dpa-addons.s3.eu-west-1.amazonaws.com/items/audio/liveblog/index.html?audio=\nhttps://dl.dropbox.com/s/h66psagh1n0kdci/4669_Nachrichten_05.64501463.mp3\" style=\"width: 100%; max-width: 100%; border:\nnone;\"></iframe>"}]
from bs4 import BeautifulSoup
def strip_div_in_p(text):
doc = BeautifulSoup(text, features="html.parser")
for p in doc.findAll("p"):
while True:
div = p.findChild("div")
if div is None:
break
else:
div.unwrap()
return doc.decode(formatter="minimal")
# -*- coding: utf-8 -*-
#
# Copyright 2016 dpa-infocom GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import os
from livebridge_liveblog.sanitize import strip_div_in_p
def test_sanitize():
texts = json.load(
open(os.path.join(os.path.dirname(__file__), "html_sanitize_tests.json")))
for example in texts:
assert strip_div_in_p(example["source"]) == example["target"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment