def scrape_transcript(engine, url, force=False):
    wp, session = url_metadata(url)
    table = sl.get_table(engine, 'speech')
    sample = sl.find_one(engine, table, source_url=url, matched=True)
    response, sio = fetch_stream(url)
    sample = check_tags(sample or {}, response, force)
    base_data = {'source_url': url, 
                 'sitzung': session,
                 'wahlperiode': wp,
                 'matched': False,
                 'loaded': False,
                 'source_etag': sample['source_etag']}
    log.info("Loading transcript: %s/%s, from %s" , wp, session, url)
    seq = 0
    parser = SpeechParser(sio)
    for contrib in parser:
        if not len(contrib['text'].strip()):
            continue
        contrib.update(base_data)
        contrib['sequence'] = seq
        sl.upsert(engine, table, contrib, 
                  unique=['source_url', 'sequence'])
        seq += 1
    if not parser.missing_recon:
        sl.upsert(engine, table, {
                    'matched': True,
                    'source_url': url,
            }, unique=['source_url'])
    else:
        raise InvalidReference()
    return base_data
Example #2
0
def scrape_transcript(engine, url, force=False):
    wp, session = url_metadata(url)
    table = sl.get_table(engine, 'speech')
    sio = find_local(url)
    sample = {'source_etag': 'local'}
    if sio is None:
        sample = sl.find_one(engine, table, source_url=url, matched=True)
        response, sio = fetch_stream(url)
        sample = check_tags(sample or {}, response, force)
    base_data = {'source_url': url,
                 'sitzung': session,
                 'wahlperiode': wp,
                 'matched': False,
                 'loaded': False,
                 'source_etag': sample['source_etag']}
    log.info("Loading transcript: %s/%s, from %s" , wp, session, url)
    seq = 0
    parser = SpeechParser(sio)
    for contrib in parser:
        if not len(contrib['text'].strip()):
            continue
        contrib.update(base_data)
        contrib['sequence'] = seq
        sl.upsert(engine, table, contrib, 
                  unique=['source_url', 'sequence'])
        seq += 1
    if not parser.missing_recon:
        sl.upsert(engine, table, {
                    'matched': True,
                    'source_url': url,
            }, unique=['source_url'])
    else:
        raise InvalidReference()
    return base_data
Example #3
0
def scrape_abstimmung(engine, url, force=False):
    abstimmung = sl.get_table(engine, 'abstimmung')
    sample = sl.find_one(engine, abstimmung, source_url=url)
    response = fetch(url)
    sample = check_tags(sample or {}, response, force)

    base_data = {'source_url': url, 'source_etag': sample['source_etag']}
    handle_xml(engine, base_data, response.content)
    return base_data
Example #4
0
def scrape_abstimmung(engine, url, force=False):
    abstimmung = sl.get_table(engine, 'abstimmung')
    sample = sl.find_one(engine, abstimmung, source_url=url)
    response = fetch(url)
    sample = check_tags(sample or {}, response, force)
    
    base_data = {'source_url': url, 
                 'source_etag': sample['source_etag']}
    handle_xml(engine, base_data, response.content)
    return base_data
Example #5
0
def scrape_gremium(engine, url, force=False):
    table = sl.get_table(engine, 'gremium')
    response, doc = _xml(url)
    a = sl.find_one(engine, table, source_url=url)
    if a is None:
        a = {'source_url': url}
    a = check_tags(a, response, force)
    a['key'] = doc.findtext('/ausschussId')
    a['name'] = doc.findtext('/ausschussName')
    log.info("Ausschuss (%s): %s" % (a['key'], a['name']))
    a['aufgabe'] = doc.findtext('/ausschussAufgabe')
    a['image_url'] = doc.findtext('/ausschussBildURL')
    a['image_copyright'] = doc.findtext('/ausschussCopyright')
    a['rss_url'] = GREMIUM_RSS_FEEDS.get(a['key'])
    a['url'] = URL_PATTERN % a['key']
    a['type'] = 'ausschuss'
    sl.upsert(engine, table, a, unique=['key'])
    return a
Example #6
0
def scrape_ablauf(engine, url, force=False):
    Ablauf = sl.get_table(engine, 'ablauf')

    key = int(url.rsplit('/', 1)[-1].split('.')[0])
    a = sl.find_one(engine, Ablauf, source_url=url)
    if a is not None and a['abgeschlossen'] and not force:
        raise Unmodified()
    response = fetch(url)
    a = check_tags(a or {}, response, force)
    a.update({'key': key, 
              'source_url': url})
    doc = inline_xml_from_page(response.content, url)
    if doc is None: 
        raise NoContentException()
    
    a['wahlperiode'] = int(doc.findtext("WAHLPERIODE"))
    a['typ'] = doc.findtext("VORGANGSTYP")
    a['titel'] = doc.findtext("TITEL")

    if not a['titel'] or not len(a['titel'].strip()):
        raise NoContentException()

    if '\n' in a['titel']:
        t, k = a['titel'].rsplit('\n', 1)
        k = k.strip()
        if k.startswith('KOM') or k.startswith('SEK'):
            a['titel'] = t

    a['initiative'] = doc.findtext("INITIATIVE")
    a['stand'] = doc.findtext("AKTUELLER_STAND")
    a['signatur'] = doc.findtext("SIGNATUR")
    a['gesta_id'] = doc.findtext("GESTA_ORDNUNGSNUMMER")
    a['eu_dok_nr'] = doc.findtext("EU_DOK_NR")
    a['abstrakt'] = doc.findtext("ABSTRAKT")
    a['sachgebiet'] = doc.findtext("SACHGEBIET")
    a['zustimmungsbeduerftig'] = doc.findtext("ZUSTIMMUNGSBEDUERFTIGKEIT")
    #a.schlagworte = []
    Schlagwort = sl.get_table(engine, 'schlagwort')
    for sw in doc.findall("SCHLAGWORT"):
        wort = {'wort': sw.text, 'source_url': url}
        sl.upsert(engine, Schlagwort, wort, unique=wort.keys())
    log.info("Ablauf %s: %s", url, a['titel'].encode('ascii', 'replace'))
    a['titel'] = a['titel'].strip().lstrip('.').strip()
    a = expand_dok_nr(a)
    a['abgeschlossen'] = DIP_ABLAUF_STATES_FINISHED.get(a['stand'], False)
    if 'Originaltext der Frage(n):' in a['abstrakt']:
        _, a['abstrakt'] = a['abstrakt'].split('Originaltext der Frage(n):', 1)

    Referenz = sl.get_table(engine, 'referenz')
    for elem in doc.findall("WICHTIGE_DRUCKSACHE"):
        link = elem.findtext("DRS_LINK")
        hash = None
        if link is not None and '#' in link:
            link, hash = link.rsplit('#', 1)
        dokument = dokument_by_id(elem.findtext("DRS_HERAUSGEBER"), 
                'drs', elem.findtext("DRS_NUMMER"), link=link)
        dokument['text'] = elem.findtext("DRS_TYP")
        dokument['seiten'] = hash
        dokument['source_url'] = url
        sl.upsert(engine, Referenz, dokument, unique=[
            'link', 'source_url', 'seiten'
            ])

    for elem in doc.findall("PLENUM"):
        link = elem.findtext("PLPR_LINK")
        if link is not None and '#' in link:
            link, hash = link.rsplit('#', 1)
        dokument = dokument_by_id(elem.findtext("PLPR_HERAUSGEBER"), 
                'plpr', elem.findtext("PLPR_NUMMER"), link=link)
        dokument['text'] = elem.findtext("PLPR_KLARTEXT")
        dokument['seiten'] = elem.findtext("PLPR_SEITEN")
        dokument['source_url'] = url
        sl.upsert(engine, Referenz, dokument, unique=[
            'link', 'source_url', 'seiten'
            ])

    sl.upsert(engine, Ablauf, a, unique=['source_url'])
    for elem in doc.findall(".//VORGANGSPOSITION"):
        scrape_activity(engine, url, elem)
    return a
Example #7
0
def scrape_mdb(engine, url, force=False):
    response, doc = _xml(url)
    id = int(doc.findtext('//mdbID'))
    table_person = sl.get_table(engine, 'person')
    table_rolle = sl.get_table(engine, 'rolle')
    p = sl.find_one(engine, table_person, mdb_id=id)
    if p is None:
        p = {'source_url': url}
    else:
        r_ = sl.find_one(engine, table_rolle, mdb_id=id, funktion='MdB')
        if r_ is not None:
            r = r_
    p = check_tags(p, response, force)
    r = {'person_source_url': url, 
         'funktion': 'MdB'}

    r['mdb_id'] = p['mdb_id'] = id
    r['status'] = doc.find('//mdbID').get('status')
    if doc.findtext('//mdbAustrittsdatum'):
        r['austritt'] = datetime.strptime(doc.findtext('//mdbAustrittsdatum'),
                                       '%d.%m.%Y').isoformat()
    p['vorname'] = doc.findtext('//mdbVorname')
    p['nachname'] = doc.findtext('//mdbZuname')
    p['adelstitel'] = doc.findtext('//mdbAdelstitel')
    p['titel'] = doc.findtext('//mdbAkademischerTitel')
    p['ort'] = doc.findtext('//mdbOrtszusatz')
    message = 'MdB: %s %s (%s)' % (p['vorname'], p['nachname'], p['ort'])
    log.info(message.encode('ascii', 'replace'))
    p['geburtsdatum'] = doc.findtext('//mdbGeburtsdatum')
    p['religion'] = doc.findtext('//mdbReligionKonfession')
    p['hochschule'] = doc.findtext('//mdbHochschulbildung')
    p['beruf'] = doc.findtext('//mdbBeruf')
    p['berufsfeld'] = doc.find('//mdbBeruf').get('berufsfeld')
    p['geschlecht'] = doc.findtext('//mdbGeschlecht')
    p['familienstand'] = doc.findtext('//mdbFamilienstand')
    p['kinder'] = doc.findtext('//mdbAnzahlKinder')
    r['fraktion'] = doc.findtext('//mdbFraktion')
    p['fraktion'] = doc.findtext('//mdbFraktion')
    p['partei'] = doc.findtext('//mdbPartei')
    p['land'] = doc.findtext('//mdbLand')
    r['gewaehlt'] = doc.findtext('//mdbGewaehlt')
    p['bio_url'] = doc.findtext('//mdbBioURL')
    p['bio'] = doc.findtext('//mdbBiografischeInformationen')
    p['wissenswertes'] = doc.findtext('//mdbWissenswertes')
    p['homepage_url'] = doc.findtext('//mdbHomepageURL')
    p['telefon'] = doc.findtext('//mdbTelefon')
    p['angaben'] = doc.findtext('//mdbVeroeffentlichungspflichtigeAngaben')
    p['foto_url'] = doc.findtext('//mdbFotoURL')
    p['foto_copyright'] = doc.findtext('//mdbFotoCopyright')
    p['reden_plenum_url'] = doc.findtext('//mdbRedenVorPlenumURL')
    p['reden_plenum_rss_url'] = doc.findtext('//mdbRedenVorPlenumRSS')
    
    p['wk_nummer'] = doc.findtext('//mdbWahlkreisNummer')
    p['wk_name'] = doc.findtext('//mdbWahlkreisName') 
    p['wk_url'] = doc.findtext('//mdbWahlkreisURL')

    for website in doc.findall('//mdbSonstigeWebsite'):
        type_ = website.findtext('mdbSonstigeWebsiteTitel')
        ws_url = website.findtext('mdbSonstigeWebsiteURL')
        if type_.lower() == 'twitter':
            p['twitter_url'] = ws_url
        if type_.lower() == 'facebook':
            p['facebook_url'] = ws_url

    if doc.findtext('//mdbBundestagspraesident'):
        sl.upsert(engine, table_rolle, {
            'person_source_url': url, 
            'funktion': u'Bundestagspräsident',
            }, 
            unique=['person_source_url', 'funktion'])
    if doc.findtext('//mdbBundestagsvizepraesident'):
        sl.upsert(engine, table_rolle, {
            'person_source_url': url, 
            'funktion': u'Bundestagsvizepräsident',
            },
            unique=['person_source_url', 'funktion'])

    for n in doc.findall('//mdbObleuteGremium'):
        add_to_gremium(n, url, 'obleute', engine)

    for n in doc.findall('//mdbVorsitzGremium'):
        add_to_gremium(n, url, 'vorsitz', engine)

    for n in doc.findall('//mdbStellvertretenderVorsitzGremium'):
        add_to_gremium(n, url, 'stellv_vorsitz', engine)

    for n in doc.findall('//mdbVorsitzSonstigesGremium'):
        add_to_gremium(n, url, 'vorsitz', engine)

    for n in doc.findall('//mdbStellvVorsitzSonstigesGremium'):
        add_to_gremium(n, url, 'stellv_vorsitz', engine)

    for n in doc.findall('//mdbOrdentlichesMitgliedGremium'):
        add_to_gremium(n, url, 'mitglied', engine)

    for n in doc.findall('//mdbStellvertretendesMitgliedGremium'):
        add_to_gremium(n, url, 'stellv_mitglied', engine)

    for n in doc.findall('//mdbOrdentlichesMitgliedSonstigesGremium'):
        add_to_gremium(n, url, 'mitglied', engine)

    for n in doc.findall('//mdbStellvertretendesMitgliedSonstigesGremium'):
        add_to_gremium(n, url, 'stellv_mitglied', engine)

    sl.upsert(engine, table_person, p, unique=['source_url'])
    sl.upsert(engine, table_rolle, r, unique=['person_source_url', 'funktion'])
    return p
Example #8
0
def scrape_mdb(engine, url, force=False):
    response, doc = _xml(url)
    id = int(doc.findtext('//mdbID'))
    table_person = sl.get_table(engine, 'person')
    table_rolle = sl.get_table(engine, 'rolle')
    p = sl.find_one(engine, table_person, mdb_id=id)
    if p is None:
        p = {'source_url': url}
    else:
        r_ = sl.find_one(engine, table_rolle, mdb_id=id, funktion='MdB')
        if r_ is not None:
            r = r_
    p = check_tags(p, response, force)
    r = {'person_source_url': url, 'funktion': 'MdB'}

    r['mdb_id'] = p['mdb_id'] = id
    r['status'] = doc.find('//mdbID').get('status')
    if doc.findtext('//mdbAustrittsdatum'):
        r['austritt'] = datetime.strptime(doc.findtext('//mdbAustrittsdatum'),
                                          '%d.%m.%Y').isoformat()
    p['vorname'] = doc.findtext('//mdbVorname')
    p['nachname'] = doc.findtext('//mdbZuname')
    p['adelstitel'] = doc.findtext('//mdbAdelstitel')
    p['titel'] = doc.findtext('//mdbAkademischerTitel')
    p['ort'] = doc.findtext('//mdbOrtszusatz')
    message = 'MdB: %s %s (%s)' % (p['vorname'], p['nachname'], p['ort'])
    log.info(message.encode('ascii', 'replace'))
    p['geburtsdatum'] = doc.findtext('//mdbGeburtsdatum')
    p['religion'] = doc.findtext('//mdbReligionKonfession')
    p['hochschule'] = doc.findtext('//mdbHochschulbildung')
    p['beruf'] = doc.findtext('//mdbBeruf')
    p['berufsfeld'] = doc.find('//mdbBeruf').get('berufsfeld')
    p['geschlecht'] = doc.findtext('//mdbGeschlecht')
    p['familienstand'] = doc.findtext('//mdbFamilienstand')
    p['kinder'] = doc.findtext('//mdbAnzahlKinder')
    r['fraktion'] = doc.findtext('//mdbFraktion')
    p['fraktion'] = doc.findtext('//mdbFraktion')
    p['partei'] = doc.findtext('//mdbPartei')
    p['land'] = doc.findtext('//mdbLand')
    r['gewaehlt'] = doc.findtext('//mdbGewaehlt')
    p['bio_url'] = doc.findtext('//mdbBioURL')
    p['bio'] = doc.findtext('//mdbBiografischeInformationen')
    p['wissenswertes'] = doc.findtext('//mdbWissenswertes')
    p['homepage_url'] = doc.findtext('//mdbHomepageURL')
    p['telefon'] = doc.findtext('//mdbTelefon')
    p['angaben'] = doc.findtext('//mdbVeroeffentlichungspflichtigeAngaben')
    p['foto_url'] = doc.findtext('//mdbFotoURL')
    p['foto_copyright'] = doc.findtext('//mdbFotoCopyright')
    p['reden_plenum_url'] = doc.findtext('//mdbRedenVorPlenumURL')
    p['reden_plenum_rss_url'] = doc.findtext('//mdbRedenVorPlenumRSS')

    p['wk_nummer'] = doc.findtext('//mdbWahlkreisNummer')
    p['wk_name'] = doc.findtext('//mdbWahlkreisName')
    p['wk_url'] = doc.findtext('//mdbWahlkreisURL')

    for website in doc.findall('//mdbSonstigeWebsite'):
        type_ = website.findtext('mdbSonstigeWebsiteTitel')
        ws_url = website.findtext('mdbSonstigeWebsiteURL')
        if type_.lower() == 'twitter':
            p['twitter_url'] = ws_url
        if type_.lower() == 'facebook':
            p['facebook_url'] = ws_url

    if doc.findtext('//mdbBundestagspraesident'):
        sl.upsert(engine,
                  table_rolle, {
                      'person_source_url': url,
                      'funktion': u'Bundestagspräsident',
                  },
                  unique=['person_source_url', 'funktion'])
    if doc.findtext('//mdbBundestagsvizepraesident'):
        sl.upsert(engine,
                  table_rolle, {
                      'person_source_url': url,
                      'funktion': u'Bundestagsvizepräsident',
                  },
                  unique=['person_source_url', 'funktion'])

    for n in doc.findall('//mdbObleuteGremium'):
        add_to_gremium(n, url, 'obleute', engine)

    for n in doc.findall('//mdbVorsitzGremium'):
        add_to_gremium(n, url, 'vorsitz', engine)

    for n in doc.findall('//mdbStellvertretenderVorsitzGremium'):
        add_to_gremium(n, url, 'stellv_vorsitz', engine)

    for n in doc.findall('//mdbVorsitzSonstigesGremium'):
        add_to_gremium(n, url, 'vorsitz', engine)

    for n in doc.findall('//mdbStellvVorsitzSonstigesGremium'):
        add_to_gremium(n, url, 'stellv_vorsitz', engine)

    for n in doc.findall('//mdbOrdentlichesMitgliedGremium'):
        add_to_gremium(n, url, 'mitglied', engine)

    for n in doc.findall('//mdbStellvertretendesMitgliedGremium'):
        add_to_gremium(n, url, 'stellv_mitglied', engine)

    for n in doc.findall('//mdbOrdentlichesMitgliedSonstigesGremium'):
        add_to_gremium(n, url, 'mitglied', engine)

    for n in doc.findall('//mdbStellvertretendesMitgliedSonstigesGremium'):
        add_to_gremium(n, url, 'stellv_mitglied', engine)

    sl.upsert(engine, table_person, p, unique=['source_url'])
    sl.upsert(engine, table_rolle, r, unique=['person_source_url', 'funktion'])
    return p
Example #9
0
def scrape_ablauf(engine, url, force=False):
    Ablauf = sl.get_table(engine, 'ablauf')

    key = int(url.rsplit('/', 1)[-1].split('.')[0])
    a = sl.find_one(engine, Ablauf, source_url=url)
    if a is not None and a['abgeschlossen'] and not force:
        raise Unmodified()
    response = fetch(url)
    a = check_tags(a or {}, response, force)
    a.update({'key': key, 'source_url': url})
    doc = inline_xml_from_page(response.content, url)
    if doc is None:
        raise NoContentException()

    a['wahlperiode'] = int(doc.findtext("WAHLPERIODE"))
    a['typ'] = doc.findtext("VORGANGSTYP")
    a['titel'] = doc.findtext("TITEL")

    if not a['titel'] or not len(a['titel'].strip()):
        raise NoContentException()

    if '\n' in a['titel']:
        t, k = a['titel'].rsplit('\n', 1)
        k = k.strip()
        if k.startswith('KOM') or k.startswith('SEK'):
            a['titel'] = t

    a['initiative'] = doc.findtext("INITIATIVE")
    a['stand'] = doc.findtext("AKTUELLER_STAND")
    a['signatur'] = doc.findtext("SIGNATUR")
    a['gesta_id'] = doc.findtext("GESTA_ORDNUNGSNUMMER")
    a['eu_dok_nr'] = doc.findtext("EU_DOK_NR")
    a['abstrakt'] = doc.findtext("ABSTRAKT")
    a['sachgebiet'] = doc.findtext("SACHGEBIET")
    a['zustimmungsbeduerftig'] = doc.findtext("ZUSTIMMUNGSBEDUERFTIGKEIT")
    #a.schlagworte = []
    Schlagwort = sl.get_table(engine, 'schlagwort')
    for sw in doc.findall("SCHLAGWORT"):
        wort = {'wort': sw.text, 'source_url': url}
        sl.upsert(engine, Schlagwort, wort, unique=wort.keys())
    log.info("Ablauf %s: %s", url, a['titel'].encode('ascii', 'replace'))
    a['titel'] = a['titel'].strip().lstrip('.').strip()
    a = expand_dok_nr(a)
    a['abgeschlossen'] = DIP_ABLAUF_STATES_FINISHED.get(a['stand'], False)

    if a['wahlperiode'] != max(app.config.get('WAHLPERIODEN')):
        a['abgeschlossen'] = True

    if 'Originaltext der Frage(n):' in a['abstrakt']:
        _, a['abstrakt'] = a['abstrakt'].split('Originaltext der Frage(n):', 1)

    sl.delete(engine, sl.get_table(engine, 'position'), source_url=url)
    sl.delete(engine, sl.get_table(engine, 'beitrag'), source_url=url)
    sl.delete(engine, sl.get_table(engine, 'zuweisung'), source_url=url)
    sl.delete(engine, sl.get_table(engine, 'beschluss'), source_url=url)
    sl.delete(engine, sl.get_table(engine, 'referenz'), source_url=url)

    for elem in doc.findall(".//VORGANGSPOSITION"):
        scrape_activity(engine, url, elem)

    Referenz = sl.get_table(engine, 'referenz')
    for elem in doc.findall("WICHTIGE_DRUCKSACHE"):
        link = elem.findtext("DRS_LINK")
        hash = None
        if link is not None and '#' in link:
            link, hash = link.rsplit('#', 1)
        dokument = dokument_by_id(elem.findtext("DRS_HERAUSGEBER"),
                                  'drs',
                                  elem.findtext("DRS_NUMMER"),
                                  link=link)
        dokument['text'] = elem.findtext("DRS_TYP")
        dokument['seiten'] = hash
        dokument['source_url'] = url
        sl.upsert(engine,
                  Referenz,
                  dokument,
                  unique=['link', 'source_url', 'seiten'])

    for elem in doc.findall("PLENUM"):
        link = elem.findtext("PLPR_LINK")
        if link is not None and '#' in link:
            link, hash = link.rsplit('#', 1)
        dokument = dokument_by_id(elem.findtext("PLPR_HERAUSGEBER"),
                                  'plpr',
                                  elem.findtext("PLPR_NUMMER"),
                                  link=link)
        dokument['text'] = elem.findtext("PLPR_KLARTEXT")
        dokument['seiten'] = elem.findtext("PLPR_SEITEN")
        dokument['source_url'] = url
        sl.upsert(engine,
                  Referenz,
                  dokument,
                  unique=['link', 'source_url', 'seiten'])

    sl.upsert(engine, Ablauf, a, unique=['source_url'])
    return a
Example #10
0
def scrape_mdb(engine, url, force=False):
    response, doc = _xml(url)
    id = int(doc.findtext("//mdbID"))
    table_person = sl.get_table(engine, "person")
    table_rolle = sl.get_table(engine, "rolle")
    p = sl.find_one(engine, table_person, mdb_id=id)
    if p is None:
        p = {"source_url": url}
    else:
        r_ = sl.find_one(engine, table_rolle, mdb_id=id, funktion="MdB")
        if r_ is not None:
            r = r_
    p = check_tags(p, response, force)
    r = {"person_source_url": url, "funktion": "MdB"}

    r["mdb_id"] = p["mdb_id"] = id
    r["status"] = doc.find("//mdbID").get("status")
    if doc.findtext("//mdbAustrittsdatum"):
        r["austritt"] = datetime.strptime(doc.findtext("//mdbAustrittsdatum"), "%d.%m.%Y").isoformat()
    p["vorname"] = doc.findtext("//mdbVorname")
    p["nachname"] = doc.findtext("//mdbZuname")
    p["adelstitel"] = doc.findtext("//mdbAdelstitel")
    p["titel"] = doc.findtext("//mdbAkademischerTitel")
    p["ort"] = doc.findtext("//mdbOrtszusatz")
    message = "MdB: %s %s (%s)" % (p["vorname"], p["nachname"], p["ort"])
    log.info(message.encode("ascii", "replace"))
    p["geburtsdatum"] = doc.findtext("//mdbGeburtsdatum")
    p["religion"] = doc.findtext("//mdbReligionKonfession")
    p["hochschule"] = doc.findtext("//mdbHochschulbildung")
    p["beruf"] = doc.findtext("//mdbBeruf")
    p["berufsfeld"] = doc.find("//mdbBeruf").get("berufsfeld")
    p["geschlecht"] = doc.findtext("//mdbGeschlecht")
    p["familienstand"] = doc.findtext("//mdbFamilienstand")
    p["kinder"] = doc.findtext("//mdbAnzahlKinder")
    r["fraktion"] = doc.findtext("//mdbFraktion")
    p["fraktion"] = doc.findtext("//mdbFraktion")
    p["partei"] = doc.findtext("//mdbPartei")
    p["land"] = doc.findtext("//mdbLand")
    r["gewaehlt"] = doc.findtext("//mdbGewaehlt")
    p["bio_url"] = doc.findtext("//mdbBioURL")
    p["bio"] = doc.findtext("//mdbBiografischeInformationen")
    p["wissenswertes"] = doc.findtext("//mdbWissenswertes")
    p["homepage_url"] = doc.findtext("//mdbHomepageURL")
    p["telefon"] = doc.findtext("//mdbTelefon")
    p["angaben"] = doc.findtext("//mdbVeroeffentlichungspflichtigeAngaben")
    p["foto_url"] = doc.findtext("//mdbFotoURL")
    p["foto_copyright"] = doc.findtext("//mdbFotoCopyright")
    p["reden_plenum_url"] = doc.findtext("//mdbRedenVorPlenumURL")
    p["reden_plenum_rss_url"] = doc.findtext("//mdbRedenVorPlenumRSS")

    p["wk_nummer"] = doc.findtext("//mdbWahlkreisNummer")
    p["wk_name"] = doc.findtext("//mdbWahlkreisName")
    p["wk_url"] = doc.findtext("//mdbWahlkreisURL")

    for website in doc.findall("//mdbSonstigeWebsite"):
        type_ = website.findtext("mdbSonstigeWebsiteTitel")
        ws_url = website.findtext("mdbSonstigeWebsiteURL")
        if type_.lower() == "twitter":
            p["twitter_url"] = ws_url
        if type_.lower() == "facebook":
            p["facebook_url"] = ws_url

    if doc.findtext("//mdbBundestagspraesident"):
        sl.upsert(
            engine,
            table_rolle,
            {"person_source_url": url, "funktion": u"Bundestagspräsident"},
            unique=["person_source_url", "funktion"],
        )
    if doc.findtext("//mdbBundestagsvizepraesident"):
        sl.upsert(
            engine,
            table_rolle,
            {"person_source_url": url, "funktion": u"Bundestagsvizepräsident"},
            unique=["person_source_url", "funktion"],
        )

    for n in doc.findall("//mdbObleuteGremium"):
        add_to_gremium(n, url, "obleute", engine)

    for n in doc.findall("//mdbVorsitzGremium"):
        add_to_gremium(n, url, "vorsitz", engine)

    for n in doc.findall("//mdbStellvertretenderVorsitzGremium"):
        add_to_gremium(n, url, "stellv_vorsitz", engine)

    for n in doc.findall("//mdbVorsitzSonstigesGremium"):
        add_to_gremium(n, url, "vorsitz", engine)

    for n in doc.findall("//mdbStellvVorsitzSonstigesGremium"):
        add_to_gremium(n, url, "stellv_vorsitz", engine)

    for n in doc.findall("//mdbOrdentlichesMitgliedGremium"):
        add_to_gremium(n, url, "mitglied", engine)

    for n in doc.findall("//mdbStellvertretendesMitgliedGremium"):
        add_to_gremium(n, url, "stellv_mitglied", engine)

    for n in doc.findall("//mdbOrdentlichesMitgliedSonstigesGremium"):
        add_to_gremium(n, url, "mitglied", engine)

    for n in doc.findall("//mdbStellvertretendesMitgliedSonstigesGremium"):
        add_to_gremium(n, url, "stellv_mitglied", engine)

    sl.upsert(engine, table_person, p, unique=["source_url"])
    sl.upsert(engine, table_rolle, r, unique=["person_source_url", "funktion"])
    return p