def test_detect_speaker2(self):
        raw = """<div><p class="StandardRB" style="margin-bottom:.70em"><a name="R_41346_10"><b><span style="display:none"><!--†--></span>Abgeordneter </b></a><b><a href="/WWER/PAD_01781/">Dr.&nbsp;Wolfgang&nbsp;Schüssel</a></b> (ÖVP) <i>(zur Geschäftsbehandlung)</i><i><span style="display: none"><!--¦--></span>:</i> Ich meine, in der Sache selber haben wir das, glaube ich, zuerst schon besprochen. Es ist Sache des Präsidiums, zu entscheiden. </p>
<p class="StandardRE">Nur, lieber Peter Westenthaler, das Argument halte ich für höchst bedenklich, dass man quasi jetzt einer Vielzahl von Exekutivbeamten unterstellt: Weil sie zu wenig ver­dienen, sind sie korruptionsgefährdet. <i>(Abg. Ing.&nbsp;<b>Westenthaler:</b> Es ist aber so!)</i> Das weise ich mit aller Entschiedenheit zurück, meine Damen und Herren! <i>(Beifall bei ÖVP, SPÖ und Grünen.)</i></p>
<p class="RE" style="margin-bottom:1.20em">16.42</p></div>"""
        par = Selector(text=raw).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
        self.assertEqual(speaker['found'], True)
        self.assertEqual(speaker['id'], 'PAD_01781')
        self.assertEqual(speaker['role'], 'abg')
        self.assertTrue(speaker['cleaned'].startswith('Ich meine, in der'))
    def test_detect_speaker2(self):
        raw = """<div><p class="StandardRB" style="margin-bottom:.70em"><a name="R_41346_10"><b><span style="display:none"><!--†--></span>Abgeordneter </b></a><b><a href="/WWER/PAD_01781/">Dr.&nbsp;Wolfgang&nbsp;Schüssel</a></b> (ÖVP) <i>(zur Geschäftsbehandlung)</i><i><span style="display: none"><!--¦--></span>:</i> Ich meine, in der Sache selber haben wir das, glaube ich, zuerst schon besprochen. Es ist Sache des Präsidiums, zu entscheiden. </p>
<p class="StandardRE">Nur, lieber Peter Westenthaler, das Argument halte ich für höchst bedenklich, dass man quasi jetzt einer Vielzahl von Exekutivbeamten unterstellt: Weil sie zu wenig ver­dienen, sind sie korruptionsgefährdet. <i>(Abg. Ing.&nbsp;<b>Westenthaler:</b> Es ist aber so!)</i> Das weise ich mit aller Entschiedenheit zurück, meine Damen und Herren! <i>(Beifall bei ÖVP, SPÖ und Grünen.)</i></p>
<p class="RE" style="margin-bottom:1.20em">16.42</p></div>"""
        par = Selector(text=raw).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
        self.assertEqual(speaker['found'], True)
        self.assertEqual(speaker['id'], 'PAD_01781')
        self.assertEqual(speaker['role'], 'abg')
        self.assertTrue(speaker['cleaned'].startswith('Ich meine, in der'))
    def test_colon_inside_comment(self):
        # Here, the colon to delimit speaker part from speech has slipped
        # inside the comment
        raw = """<p class="MsoNormal" style="margin-top:.70em;margin-right:0cm;margin-bottom:.70em; margin-left:0cm"><b><span style="display:none"><!--†--></span>Präsidentin <a href="/WWER/PAD_08240/">Dr.&nbsp;Eva&nbsp;Glawischnig-Piesczek</a><span style="display:none"><!--¦--></span></b> <i>(das Glockenzeichen gebend):</i> Ich bitte um ein bisschen mehr Aufmerksamkeit! Danke.</p>
<p class="MsoNormal" style="margin-top:.70em;margin-right:0cm;margin-bottom:.70em; margin-left:0cm"><b><span style="display:none">&nbsp;</span></b></p>"""
        par = Selector(text=raw).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
        self.assertEqual(speaker['found'], True)
        self.assertEqual(speaker['id'], 'PAD_08240')
        self.assertEqual(speaker['role'], 'pres')
        self.assertTrue(speaker['cleaned'].startswith('Ich bitte um ein'))
    def test_colon_inside_comment(self):
        # Here, the colon to delimit speaker part from speech has slipped
        # inside the comment
        raw = """<p class="MsoNormal" style="margin-top:.70em;margin-right:0cm;margin-bottom:.70em; margin-left:0cm"><b><span style="display:none"><!--†--></span>Präsidentin <a href="/WWER/PAD_08240/">Dr.&nbsp;Eva&nbsp;Glawischnig-Piesczek</a><span style="display:none"><!--¦--></span></b> <i>(das Glockenzeichen gebend):</i> Ich bitte um ein bisschen mehr Aufmerksamkeit! Danke.</p>
<p class="MsoNormal" style="margin-top:.70em;margin-right:0cm;margin-bottom:.70em; margin-left:0cm"><b><span style="display:none">&nbsp;</span></b></p>"""
        par = Selector(text=raw).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
        self.assertEqual(speaker['found'], True)
        self.assertEqual(speaker['id'], 'PAD_08240')
        self.assertEqual(speaker['role'], 'pres')
        self.assertTrue(speaker['cleaned'].startswith('Ich bitte um ein'))
    def test_detect_speaker_minister_simple(self):
        abg_paragraph = u"""<p class=MsoNormal style='margin-top:.70em;margin-right:0cm;margin-bottom:.70em; margin-left:0cm'><b><span lang=DE style='display:none'><!--†--></span>Bundesminister f&uuml;r Land- und Forstwirtschaft,
Umwelt und Wasserwirtschaft <A HREF="/WWER/PAD_83296/index.shtml">Ing.&nbsp;Andr&auml;&nbsp;Rupprechter</A></b>: Herr <span lang=DE>Bundesminister,
ich bin dir sehr dankbar, dass du aufgrund deiner Produktion in &Ouml;ster&shy;reich.&nbsp;&#8211; Herzlichen Dank
daf&uuml;r. <i>(Abg. <b>Neubauer</b>&nbsp;&#8211; in Richtung &Ouml;VP, eine entsprechen&shy;de Handbewegung andeutend&nbsp;&#8211;:
Klatschen!)</i></span></p>
"""
        par = Selector(text=abg_paragraph).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
        self.assertEqual(speaker['found'], True)
        self.assertEqual(speaker['id'], 'PAD_83296')
        self.assertEqual(speaker['role'], 'min')
    def test_detect_speaker_abgeordneter(self):
        abg_paragraph = u"""<p class=MsoNormal style='margin-top:.70em;margin-right:0cm;margin-bottom:.70em; margin-left:0cm'><b><span lang=DE style='display:none'><!--†--></span>Abgeordneter
<A HREF="/WWER/PAD_12907/index.shtml">Fritz&nbsp;Grillitsch</A></b> (&Ouml;VP)<span style='display:none'><!--¦--></span>: Herr <span lang=DE>Bundesminister,
ich bin dir sehr dankbar, dass du aufgrund deiner Produktion in &Ouml;ster&shy;reich.&nbsp;&#8211; Herzlichen Dank
daf&uuml;r. <i>(Abg. <b>Neubauer</b>&nbsp;&#8211; in Richtung &Ouml;VP, eine entsprechen&shy;de Handbewegung andeutend&nbsp;&#8211;:
Klatschen!)</i></span></p>
"""
        par = Selector(text=abg_paragraph).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
        self.assertEqual(speaker['found'], True)
        self.assertEqual(speaker['id'], 'PAD_12907')
        self.assertEqual(speaker['role'], 'abg')
    def test_detect_speaker_minister_simple(self):
        abg_paragraph = u"""<p class=MsoNormal style='margin-top:.70em;margin-right:0cm;margin-bottom:.70em; margin-left:0cm'><b><span lang=DE style='display:none'><!--†--></span>Bundesminister f&uuml;r Land- und Forstwirtschaft,
Umwelt und Wasserwirtschaft <A HREF="/WWER/PAD_83296/index.shtml">Ing.&nbsp;Andr&auml;&nbsp;Rupprechter</A></b>: Herr <span lang=DE>Bundesminister,
ich bin dir sehr dankbar, dass du aufgrund deiner Produktion in &Ouml;ster&shy;reich.&nbsp;&#8211; Herzlichen Dank
daf&uuml;r. <i>(Abg. <b>Neubauer</b>&nbsp;&#8211; in Richtung &Ouml;VP, eine entsprechen&shy;de Handbewegung andeutend&nbsp;&#8211;:
Klatschen!)</i></span></p>
"""
        par = Selector(text=abg_paragraph).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
        self.assertEqual(speaker['found'], True)
        self.assertEqual(speaker['id'], 'PAD_83296')
        self.assertEqual(speaker['role'], 'min')
    def test_detect_speaker_abgeordneter(self):
        abg_paragraph = u"""<p class=MsoNormal style='margin-top:.70em;margin-right:0cm;margin-bottom:.70em; margin-left:0cm'><b><span lang=DE style='display:none'><!--†--></span>Abgeordneter
<A HREF="/WWER/PAD_12907/index.shtml">Fritz&nbsp;Grillitsch</A></b> (&Ouml;VP)<span style='display:none'><!--¦--></span>: Herr <span lang=DE>Bundesminister,
ich bin dir sehr dankbar, dass du aufgrund deiner Produktion in &Ouml;ster&shy;reich.&nbsp;&#8211; Herzlichen Dank
daf&uuml;r. <i>(Abg. <b>Neubauer</b>&nbsp;&#8211; in Richtung &Ouml;VP, eine entsprechen&shy;de Handbewegung andeutend&nbsp;&#8211;:
Klatschen!)</i></span></p>
"""
        par = Selector(text=abg_paragraph).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
        self.assertEqual(speaker['found'], True)
        self.assertEqual(speaker['id'], 'PAD_12907')
        self.assertEqual(speaker['role'], 'abg')
    def test_detect_speaker_minister(self):
        # This paragraph has invalid HTML around the speaker link, and
        # only part of the speaker-name+title is enclosed by the link
        paragraph = u"""<p class=MsoNormal><b><span lang=DE style='display:none;letter-spacing:-.2pt'><!--†--></span><span style='letter-spacing:-.2pt'>Bundesminister f&uuml;r Land- und Forstwirtschaft,
Umwelt und Wasserwirtschaft <A HREF="/WWER/PAD_83296/index.shtml">Dipl.-</span>Ing.&nbsp;Andr&auml;&nbsp;Rupprechter</A><span style='display:none'><!--¦--></span>:</b> Grunds&auml;tzlich ist neben dem Heimmarkt
der Exportmarkt au&szlig;erordentlich wichtig f&uuml;r die <span lang=DE>&ouml;sterreichische
Landwirtschaft, Lebensmittelwirtschaft, weshalb wir uns gerade auch aufgrund
der Russland-Krise letztes Jahr bem&uuml;ht haben, zus&auml;tzliche neue
Drittlandm&auml;rkte zu finden. Und das ist tats&auml;chlich gelungen: Der agra&shy;rische
Au&szlig;enhandel hat sich im Jahr&nbsp;2014 trotz der sehr schwierigen
Wirtschafts&shy;bedingungen positiv entwickelt, weist immerhin ein Plus von
2,4&nbsp;Prozent gegen&uuml;ber 2013 auf, trotz des Wegfalls des so wichtigen
Marktes in Russland.</span></p>
"""
        par = Selector(text=paragraph).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)
    def test_detect_speaker_minister(self):
        # This paragraph has invalid HTML around the speaker link, and
        # only part of the speaker-name+title is enclosed by the link
        paragraph = u"""<p class=MsoNormal><b><span lang=DE style='display:none;letter-spacing:-.2pt'><!--†--></span><span style='letter-spacing:-.2pt'>Bundesminister f&uuml;r Land- und Forstwirtschaft,
Umwelt und Wasserwirtschaft <A HREF="/WWER/PAD_83296/index.shtml">Dipl.-</span>Ing.&nbsp;Andr&auml;&nbsp;Rupprechter</A><span style='display:none'><!--¦--></span>:</b> Grunds&auml;tzlich ist neben dem Heimmarkt
der Exportmarkt au&szlig;erordentlich wichtig f&uuml;r die <span lang=DE>&ouml;sterreichische
Landwirtschaft, Lebensmittelwirtschaft, weshalb wir uns gerade auch aufgrund
der Russland-Krise letztes Jahr bem&uuml;ht haben, zus&auml;tzliche neue
Drittlandm&auml;rkte zu finden. Und das ist tats&auml;chlich gelungen: Der agra&shy;rische
Au&szlig;enhandel hat sich im Jahr&nbsp;2014 trotz der sehr schwierigen
Wirtschafts&shy;bedingungen positiv entwickelt, weist immerhin ein Plus von
2,4&nbsp;Prozent gegen&uuml;ber 2013 auf, trotz des Wegfalls des so wichtigen
Marktes in Russland.</span></p>
"""
        par = Selector(text=paragraph).xpath('.//p')[0]
        p = SECTION.get_p(par)
        speaker = SECTION.detect_speaker(p.plain, p.links)