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()