Datum extrahieren - Projektauftrag

Hey ich hab ein dringendes Projekt, bin Javaunkenntlich, studiere auch etwas, wo ich meinen Weg auch schon weiß, den ich gehen werden, nur einen Javakurs muss ich dringend ungeliebter weise machen-.- Und zwar etwas jetzt die nächsten Tage abgeben und auch erklären können, dachte mein Prof lässt mich da durch gehen, aber nein… - bin sonst exmatrikuliert, also würde auch gut zahlen!
Schreibt mich bitte an wenn du etwas Zeit hast, es geht darum, Daten, also Datumsdaten von Webseiten mit dem dazugehörigen Satz zu extrahieren.
Also z.B. eins oder mehrere davon

08.05.2013
08. Mai 2013
November 31, 2013
November 31st, 2013

Ein Freund hat mir schon etwas entsprechendes in Python umgesetzt, aber mein Prof will unbedingt Java. Könnten dann skypen, FB oder eben ein dokumentierter Code.

Hier das entsprechende PythonPendant, es könnte auch etwas rudimentäreres sein:

VIelen Dank an einen Helfer, bitte sehr drum - Skype: oenabringamanmoekorieher
oder Facebook: https://www.facebook.com/kevin.ba.35?ref=tn_tnmn

Beste Grüße, Kevin!

Pythoncode:

Erst einmal muss Python, wenn nicht vorhanden z.B. Version 2.7 installiert werden, die findet sich z.B.hier:

http://www.activestate.com/activepython/downloads

Dann wird diese Datei Datum.py in die D:\ root gepastet, dann folgende Command line im Python Package Manager laufen lassen:

pip install requests

pip install BeautifulSoup4

pip install html5lib

cd d:\

python datum.py http://en.wikipedia.org/wiki/Promethea > testfile.csv

Ein Excelfile testfile.csv wird in D: generiert.

Es werden Basisdaten im Englischen erkannt.

Das in der Beispielseite enthaltene Datum wird z.B. erkannt und in ein Standardformat geschrieben,

Der dazu gehoerende Satz wird ebenso ausgegeben:

Fuer das Beispiel also: 2005-07-01 ““Magic Comic Ride”, Douglas Wolk, Salon.com, July 1, 2005”

Die Wikipedia-Beispielseite kann natuerlich dabei durch jede beliebige seite ersetzt werden.

import csv
import re
import sys
from calendar import month_name, month_abbr
from datetime import datetime as DateTime
from itertools import chain
from locale import getlocale, setlocale, LC_TIME

import bs4
import requests

Datumsausgabeformat erst Jahr, dann Monat, dann Tag

DATE_OUTPUT_FORMAT = ‘%Y-%m-%d’

Monatsnamen erstellen


def create_month_names(locale='C'):
    try:
        old_locale = getlocale(LC_TIME)
        setlocale(LC_TIME, locale)
        return (
            [n.lower() for n in names] for names in [month_name, month_abbr]
        )
    finally:
        setlocale(LC_TIME, old_locale)
 
 
MONTHS, MONTHS_SHORT = create_month_names()
NUM_RE = r'(?P<%s>\d{%s})'
YEAR_RE = NUM_RE % ('year', 4)
MONTH_RE = (
    r'(?P<month>\d{1,2}|%s)'
        % '|'.join(re.escape(m) for m in chain(MONTHS, MONTHS_SHORT) if m)
)
DAY_RE = NUM_RE % ('day', '1,2')
 

# Definition der reg Ex

ISO_RE = re.compile(r'%s-%s-%s' % (YEAR_RE, MONTH_RE, DAY_RE))
SPOKEN_RE = re.compile(r'%s %s(?:,|, | | of )%s' % (MONTH_RE, DAY_RE, YEAR_RE))
DATES_RES = ISO_RE, SPOKEN_RE
 
 
def test_iso_re():
    assert ISO_RE.match('2000-01-01')
    assert ISO_RE.match('2000-1-1')
    assert not ISO_RE.match('000-01-01.2000-01-0')
    assert ISO_RE.match('2000-feb-01')
 
 
def test_spoken_re():
    assert SPOKEN_RE.match('february 1, 2000')
    assert SPOKEN_RE.match('february 1,2000')
    assert SPOKEN_RE.match('february 1 2000')
    assert SPOKEN_RE.match('february 1 of 2000')

 
# Saetze extrahieren
 
def extract_sentences(content):
    for lines in content.split('
'):
        for sentence in lines.split('. '):
            sentence = sentence.strip()
            if sentence.endswith('.'):
                sentence = sentence[:-1]
            if sentence:
                yield sentence
 
 
def test_extract_sentences():
   
    def extract_to_list(content):
        return list(extract_sentences(content))
 
    assert extract_to_list('') == []
    assert extract_to_list('a') == ['a']
    assert extract_to_list(' a ') == ['a']
    assert extract_to_list('a.') == ['a']
    assert extract_to_list('a a') == ['a a']
    assert extract_to_list('a.a') == ['a.a']
    assert extract_to_list('a. a') == ['a', 'a']
    assert extract_to_list('a
a.') == ['a a']
 
 
# reagiert auf falsche Eingaben 

def parse_month(string):
    try:
        result = int(string)
        if not 1 <= result <= 12:
            raise ValueError('month value {0} not in 1..12'.format(result))
        return result
    except ValueError:
        try:
            return MONTHS.index(string)
        except ValueError:
            try:
                return MONTHS_SHORT.index(string)
            except ValueError:
                pass  # bewusst ignoriert
    raise ValueError('{0!r} is not a valid month name'.format(string))
 
 
def test_parse_month():
    assert parse_month('1') == 1
    assert parse_month('12') == 12
    try:
        parse_month('13') == 13
    except ValueError:
        pass
    else:
        assert False
    assert parse_month('jan') == 1
    assert parse_month('dec') == 12
    assert parse_month('january') == 1
    assert parse_month('december') == 12
 
 
def extract_dates(content):
    for sentence in extract_sentences(content):
        for date_re in DATES_RES:
            for date_match in date_re.finditer(sentence.lower()):
                try:
                    year = int(date_match.group('year'))
                    month = parse_month(date_match.group('month'))
                    day = int(date_match.group('day'))
                    yield DateTime(year, month, day), sentence
                except ValueError:
                    pass  # bewusst ignoriert
 
# test 
 
def test_extract_dates():
   
    def _extract(content):
        return list(extract_dates(content))
   
    date_a = DateTime(2000, 1, 1)
    date_b = DateTime(2000, 1, 2)
    assert _extract('') == []
    assert _extract('2000-01-01') == [(date_a, '2000-01-01')]
    assert _extract('2000-1-1') == [(date_a, '2000-1-1')]
    assert _extract(' 2000-01-01 ') == [(date_a, '2000-01-01')]
    assert _extract('	2000-01-01	') == [(date_a, '2000-01-01')]
    assert _extract('
2000-01-01
') == [(date_a, '2000-01-01')]
    assert _extract('
2000-01-01
') == [(date_a, '2000-01-01')]
    assert (
        _extract('2000-01-01.2000-01-01')
            == [(date_a, '2000-01-01.2000-01-01')] * 2
    )
    assert _extract('2000-01-01. 2000-01-01') == [(date_a, '2000-01-01')] * 2
    assert (
        _extract('2000-01-01.2000-01-02') == [
            (date_a, '2000-01-01.2000-01-02'),
            (date_b, '2000-01-01.2000-01-02'),
        ]
    )
    assert _extract('2000-01-01
2000-01-01') == [(date_a, '2000-01-01')] * 2
    assert (
        _extract('In the year 2000-01-01')
            == [(date_a, 'In the year 2000-01-01')]
    )
    assert _extract('2000-jan-01') == [(date_a, '2000-jan-01')]
    assert _extract('2000-Jan-01') == [(date_a, '2000-Jan-01')]
    assert _extract('January 1, 2000') == [(date_a, 'January 1, 2000')]
 
# Nur Text aus Body nicht aus gesamten Html Doc liefern 

def get_body_text(content):
    return bs4.BeautifulSoup(content).body.text
 
 
def main():
    if len(sys.argv) != 2:
        print 'usage: {0} http://example.com/page/etc'.format(sys.argv[0])
    else:
        try:
            response = requests.get(sys.argv[1])
        except requests.RequestException as error:
            print error
            sys.exit(1)
        body = get_body_text(response.content)
        csv_file = csv.writer(sys.stdout)
        for date, sentence in extract_dates(body):
            csv_file.writerow((date.strftime(DATE_OUTPUT_FORMAT), sentence))
 
 
if __name__ == '__main__':
    main()