summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2015-09-09 22:57:17 +0200
committerDaniel Friesel <derf@finalrewind.org>2015-09-09 22:57:17 +0200
commit556f259834d75cad6a2feeb1c5106204d5921a28 (patch)
tree70a387f46eab0bc1bdde95b3425b807c4e19295c
parent2e03d069b24a5bf27fb035386594c904fa7ff496 (diff)
Squashed commit of the following:
commit 73bb123b4a90dab9a08fa38555f0cd4afcdf3740 Author: Daniel Friesel <derf@finalrewind.org> Date: Wed Sep 9 21:08:51 2015 +0200 remove outdated and now unused tests commit 3f35ba0001aaff49a7b10acfaa83303b354c162a Author: Daniel Friesel <derf@finalrewind.org> Date: Wed Sep 9 21:07:34 2015 +0200 documentation for ::DeutscheBahn commit f4c66605dcbffedbb558ca66c5032e5252011244 Author: Daniel Friesel <derf@finalrewind.org> Date: Wed Sep 9 21:03:31 2015 +0200 re-add deutschebahn module commit 41b505bc98d4b25a7ca15465fe0bbee6c3708e9e Author: Daniel Friesel <derf@finalrewind.org> Date: Tue Sep 8 18:31:22 2015 +0200 more documentation updates commit edf7b5fbd8175b4b53735859b2a961fe6ab8cf49 Author: Daniel Friesel <derf@finalrewind.org> Date: Sun Sep 6 18:48:09 2015 +0200 improve delay and delayReason handling commit c4e9121a181de9d800226ab6fccca8abb8b14705 Author: Daniel Friesel <derf@finalrewind.org> Date: Sun Sep 6 18:22:23 2015 +0200 HAFAS.pm: Code cleanup commit edae36b16ecc5e1fa0adbece954bb348ce37e9a0 Author: Daniel Friesel <derf@finalrewind.org> Date: Sun Sep 6 13:31:46 2015 +0200 add devmode option commit f7a60ae80e59a129aae77b276925f80d7430c259 Author: Daniel Friesel <derf@finalrewind.org> Date: Sun Sep 6 01:18:28 2015 +0200 support for platform changes commit 6876d56e6dd22065c342fe1fbf42f9fcf7f3d457 Author: Daniel Friesel <derf@finalrewind.org> Date: Thu Aug 20 20:01:24 2015 +0200 documentation: DeutscheBahn -> HAFAS commit 73706f0150bd0fb9c11d2b8be89204bfd4b03235 Author: Daniel Friesel <derf@finalrewind.org> Date: Thu Aug 20 19:54:12 2015 +0200 routes and route_info are not supported here commit af8a541fd1f03131a9cd39a5548188dbc09b266a Author: Daniel Friesel <derf@finalrewind.org> Date: Thu Aug 20 19:50:35 2015 +0200 documentationfoo commit ff3f2298c7be86bb7b672359f54c39588706673e Author: Daniel Friesel <derf@finalrewind.org> Date: Thu Aug 20 19:14:30 2015 +0200 rename db-ris to hafas-m commit 754fda9974e20ee630a3a3386d6ff7c42468ca46 Author: Daniel Friesel <derf@finalrewind.org> Date: Thu Aug 20 17:18:12 2015 +0200 add support for cancelled trains and delay reasons commit f860183613ee7818a2f448e8c40bbbdb95c6180a Author: Daniel Friesel <derf@finalrewind.org> Date: Wed Aug 19 15:19:54 2015 +0200 add info message support commit 17eda1d00cdbf98a04dbbe7d3ff89c6833af016d Author: Daniel Friesel <derf@finalrewind.org> Date: Sun Aug 16 18:00:05 2015 +0200 initial hafas api support
-rwxr-xr-xbin/hafas-m (renamed from bin/db-ris)104
-rw-r--r--lib/Travel/Status/DE/DeutscheBahn.pm333
-rw-r--r--lib/Travel/Status/DE/DeutscheBahn/Result.pm365
-rw-r--r--lib/Travel/Status/DE/HAFAS.pm346
-rw-r--r--lib/Travel/Status/DE/HAFAS/Result.pm277
-rw-r--r--t/20-db.t79
-rw-r--r--t/in/essen.html2609
7 files changed, 686 insertions, 3427 deletions
diff --git a/bin/db-ris b/bin/hafas-m
index 4c4fc33..cc78d26 100755
--- a/bin/db-ris
+++ b/bin/hafas-m
@@ -7,17 +7,16 @@ our $VERSION = '1.05';
use Getopt::Long qw(:config no_ignore_case);
use List::Util qw(first max);
-use Travel::Status::DE::DeutscheBahn;
+use Travel::Status::DE::HAFAS;
my %train_type;
my ( $date, $time );
-my $arrivals = 0;
-my $filter_via;
-my $ignore_late = 0;
-my $show_full_route = 0;
-my $types = q{};
+my $arrivals = 0;
+my $ignore_late = 0;
+my $types = q{};
my $language;
+my $developer_mode;
my @output;
@@ -26,14 +25,13 @@ binmode( STDOUT, ':encoding(utf-8)' );
GetOptions(
'a|arrivals' => \$arrivals,
'd|date=s' => \$date,
- 'f|full-route' => \$show_full_route,
'h|help' => sub { show_help(0) },
'l|lang=s' => \$language,
'L|ignore-late' => \$ignore_late,
'm|mot=s' => \$types,
't|time=s' => \$time,
- 'v|via=s' => \$filter_via,
'V|version' => \&show_version,
+ 'devmode' => \$developer_mode,
) or show_help(1);
@@ -46,27 +44,28 @@ for my $type ( split( qr{,}, $types ) ) {
}
}
-my $status = Travel::Status::DE::DeutscheBahn->new(
- date => $date,
- language => $language,
- mot => \%train_type,
- station => shift || show_help(1),
- time => $time,
- mode => $arrivals ? 'arr' : 'dep',
+my $status = Travel::Status::DE::HAFAS->new(
+ date => $date,
+ language => $language,
+ mot => \%train_type,
+ station => shift || show_help(1),
+ time => $time,
+ mode => $arrivals ? 'arr' : 'dep',
+ developer_mode => $developer_mode,
);
sub show_help {
my ($code) = @_;
- print 'Usage: db-ris [-d <dd.mm.yyyy>] [-m <motlist>] [-t <time>] '
- . "[-v <via>] <station>\n"
- . "See also: man db-ris\n";
+ print 'Usage: hafas-m [-d <dd.mm.yyyy>] [-m <motlist>] [-t <time>] '
+ . "<station>\n"
+ . "See also: man hafas-m\n";
exit $code;
}
sub show_version {
- say "db-ris version ${VERSION}";
+ say "hafas-m version ${VERSION}";
exit 0;
}
@@ -80,23 +79,28 @@ sub display_result {
die("Nothing to show\n");
}
- for my $i ( 0 .. 5 ) {
+ for my $i ( 0 .. 4 ) {
$line_length[$i] = max map { length( $_->[$i] ) } @lines;
}
for my $line (@lines) {
- printf(
- join( q{ }, ( map { "%-${_}s" } @line_length ) ) . "\n",
- @{$line}[ 0 .. 5 ]
- );
- if ( $line->[7] ) {
- print " " . $line->[7] . "\n";
+ my $d = $line->[6];
+ if ( $d->messages ) {
+ print "\n";
+ for my $msg ( $d->messages ) {
+ printf( "# %s\n", $msg );
+ }
}
- if ($show_full_route) {
- print "\n" . $line->[6] . "\n\n\n";
+ printf(
+ join( q{ }, ( map { "%-${_}s" } @line_length ) ),
+ @{$line}[ 0 .. 4 ]
+ );
+ if ( $line->[5] ) {
+ print $line->[5];
}
+ print "\n";
}
return;
@@ -109,14 +113,6 @@ if ( my $err = $status->errstr ) {
for my $d ( $status->results() ) {
- my @via;
-
- @via = $d->route;
-
- if ( $filter_via and not( first { $_ =~ m{$filter_via}io } @via ) ) {
- next;
- }
-
if ( $ignore_late and $d->delay ) {
next;
}
@@ -125,14 +121,14 @@ for my $d ( $status->results() ) {
@output,
[
$d->time,
+ $d->is_cancelled
+ ? 'CANCELED'
+ : ( $d->delay ? '+' . $d->delay : q{} ),
$d->train,
- $arrivals ? q{} : join( q{ }, $d->route_interesting ),
$d->route_end,
- $d->platform,
+ ( $d->platform // q{} ) . ( $d->is_changed_platform ? ' !' : q{} ),
$d->info,
- join( "\n",
- map { sprintf( '%-5s %s', @{$_} ) } $d->route_timetable ),
- $d->route_info,
+ $d
]
);
}
@@ -143,12 +139,12 @@ __END__
=head1 NAME
-db-ris - Interface to the DeutscheBahn online departure monitor
+hafas-m - Interface to the DeutscheBahn/HAFAS online departure monitor
=head1 SYNOPSIS
-B<db-ris> [B<-a>] [B<-d> I<date>] [B<-L>] [B<-m> I<motlist>] [B<-t> I<time>]
-[B<-v> I<via>] I<station>
+B<hafas-m> [B<-a>] [B<-d> I<date>] [B<-L>] [B<-m> I<motlist>] [B<-t> I<time>]
+I<station>
=head1 VERSION
@@ -156,8 +152,8 @@ version 1.05
=head1 DESCRIPTION
-db-ris is an interface to the DeutscheBahn departure monitor
-available at L<http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn>.
+hafas-m is an interface to HAFAS-based departure monitors, for instance the
+one available at L<http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn>.
It requests all departures at I<station> (optionally filtered by date, time,
route and means of transport) and lists them on stdout, similar to the big
@@ -178,10 +174,6 @@ I<station>, not I<station> and end.
Date to list departures for. Default: today.
-=item B<-f>, B<--full-route>
-
-Display complete routes (including arrival times) of all trains.
-
=item B<-l>, B<--lang> B<d>|B<e>|B<i>|B<n>
Set language used for additional information. Supports B<d>eutsch (default),
@@ -215,13 +207,6 @@ only want to see S-Bahn and U-Bahn departures, you'd have to use C<< -m
Time to list departures for. Default: now.
-=item B<-v>, B<--via> I<regex>
-
-Only display trains whose route (all stations between the current stop and the
-destination) matches the perl regular expression I<regex>. The match is not
-case-sensitive. Use '^regex$' to match a full string, but be aware that this
-may not work as expected.
-
=item B<-V>, B<--version>
Show version information.
@@ -250,12 +235,11 @@ None.
=head1 BUGS AND LIMITATIONS
-There are a few character encoding problems (most notably, B<--via> does not
-understand UTF-8 umlauts).
+Unknown.
=head1 AUTHOR
-Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
+Copyright (C) 2015 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
=head1 LICENSE
diff --git a/lib/Travel/Status/DE/DeutscheBahn.pm b/lib/Travel/Status/DE/DeutscheBahn.pm
index 94af401..edec8fe 100644
--- a/lib/Travel/Status/DE/DeutscheBahn.pm
+++ b/lib/Travel/Status/DE/DeutscheBahn.pm
@@ -4,258 +4,16 @@ use strict;
use warnings;
use 5.010;
-no if $] >= 5.018, warnings => "experimental::smartmatch";
-
-use Carp qw(confess);
-use LWP::UserAgent;
-use POSIX qw(strftime);
-use Travel::Status::DE::DeutscheBahn::Result;
-use XML::LibXML;
+use parent 'Travel::Status::DE::HAFAS';
our $VERSION = '1.05';
sub new {
- my ( $obj, %conf ) = @_;
- my $date = strftime( '%d.%m.%Y', localtime(time) );
- my $time = strftime( '%H:%M', localtime(time) );
-
- my %lwp_options = %{ $conf{lwp_options} // { timeout => 10 } };
-
- my $ua = LWP::UserAgent->new(%lwp_options);
-
- $ua->env_proxy;
-
- my $reply;
-
- my $lang = $conf{language} // 'd';
-
- if ( not $conf{station} ) {
- confess('You need to specify a station');
- }
-
- my $ref = {
- mot_filter => [
- $conf{mot}->{ice} // 1,
- $conf{mot}->{ic_ec} // 1,
- $conf{mot}->{d} // 1,
- $conf{mot}->{nv} // 1,
- $conf{mot}->{s} // 1,
- $conf{mot}->{bus} // 0,
- $conf{mot}->{ferry} // 0,
- $conf{mot}->{u} // 0,
- $conf{mot}->{tram} // 0,
- ],
- post => {
- advancedProductMode => q{},
- input => $conf{station},
- date => $conf{date} || $date,
- time => $conf{time} || $time,
- REQTrain_name => q{},
- start => 'yes',
- boardType => $conf{mode} // 'dep',
-
- # L => 'vs_java3',
- },
- };
-
- for my $i ( 0 .. @{ $ref->{mot_filter} } ) {
- if ( $ref->{mot_filter}->[$i] ) {
- $ref->{post}->{"GUIREQProduct_$i"} = 'on';
- }
- }
-
- bless( $ref, $obj );
+ my ( $class, %opt ) = @_;
- $reply
- = $ua->post(
- "http://reiseauskunft.bahn.de/bin/bhftafel.exe/${lang}n?rt=1",
- $ref->{post} );
+ $opt{service} = 'deutschebahn';
- if ( $reply->is_error ) {
- $ref->{errstr} = $reply->status_line();
- return $ref;
- }
-
- $ref->{html} = $reply->content;
-
- $ref->{tree} = XML::LibXML->load_html(
- string => $ref->{html},
- recover => 2,
- suppress_errors => 1,
- suppress_warnings => 1,
- );
-
- $ref->check_input_error();
-
- return $ref;
-}
-
-sub new_from_html {
- my ( $obj, %opt ) = @_;
-
- my $ref = {
- html => $opt{html},
- post => { boardType => $opt{mode} // 'dep' }
- };
-
- $ref->{post}->{boardType} = $opt{mode} // 'dep';
-
- $ref->{tree} = XML::LibXML->load_html(
- string => $ref->{html},
- recover => 2,
- suppress_errors => 1,
- suppress_warnings => 1,
- );
-
- return bless( $ref, $obj );
-}
-
-sub check_input_error {
- my ($self) = @_;
-
- my $xp_errdiv = XML::LibXML::XPathExpression->new(
- '//div[@class = "errormsg leftMargin"]');
- my $xp_opts
- = XML::LibXML::XPathExpression->new('//select[@class = "error"]');
- my $xp_values = XML::LibXML::XPathExpression->new('./option');
-
- my $e_errdiv = ( $self->{tree}->findnodes($xp_errdiv) )[0];
- my $e_opts = ( $self->{tree}->findnodes($xp_opts) )[0];
-
- if ($e_errdiv) {
- $self->{errstr} = $e_errdiv->textContent;
-
- if ($e_opts) {
- my @nodes = ( $e_opts->findnodes($xp_values) );
- $self->{errstr}
- .= join( q{}, map { "\n" . $_->textContent } @nodes );
- }
- }
-
- return;
-}
-
-sub errstr {
- my ($self) = @_;
-
- return $self->{errstr};
-}
-
-sub get_node {
- my ( $parent, $name, $xpath, $index ) = @_;
- $index //= 0;
-
- my @nodes = $parent->findnodes($xpath);
-
- if ( $#nodes < $index ) {
-
- # called by map, so we must explicitly return undef.
- ## no critic (Subroutines::ProhibitExplicitReturnUndef)
- return undef;
- }
-
- my $node = $nodes[$index];
-
- return $node->textContent;
-}
-
-sub results {
- my ($self) = @_;
- my $mode = $self->{post}->{boardType};
-
- my $xp_element = XML::LibXML::XPathExpression->new(
- "//table[\@class = \"result stboard ${mode}\"]/tr");
- my $xp_train_more = XML::LibXML::XPathExpression->new('./td[3]/a');
-
- # bhftafel.exe is not y2k1-safe
- my $re_morelink = qr{ date = (?<date> .. [.] .. [.] .. ) }x;
-
- my @parts = (
- [ 'time', './td[@class="time"]' ],
- [ 'train', './td[3]' ],
- [ 'route', './td[@class="route"]' ],
- [ 'dest', './td[@class="route"]//a' ],
- [ 'platform', './td[@class="platform"]' ],
- [ 'info', './td[@class="ris"]' ],
- [ 'routeinfo', './td[@class="route"]//span[@class="red bold"]' ],
- );
-
- @parts = map { [ $_->[0], XML::LibXML::XPathExpression->new( $_->[1] ) ] }
- @parts;
-
- my $re_via = qr{
- ^ \s* (?<stop> .+? ) \s* \n
- (?<time> \d{1,2}:\d{1,2} )
- }mx;
-
- if ( defined $self->{results} ) {
- return @{ $self->{results} };
- }
- if ( not defined $self->{tree} ) {
- return;
- }
-
- $self->{results} = [];
-
- for my $tr ( @{ $self->{tree}->findnodes($xp_element) } ) {
-
- my @via;
- my $first = 1;
- my ( $time, $train, $route, $dest, $platform, $info, $routeinfo )
- = map { get_node( $tr, @{$_} ) } @parts;
- my $e_train_more = ( $tr->findnodes($xp_train_more) )[0];
-
- if ( not( $time and $dest ) ) {
- next;
- }
-
- $e_train_more->getAttribute('href') =~ $re_morelink;
-
- my $date = $+{date};
-
- substr( $date, 6, 0 ) = '20';
-
- $platform //= q{};
- $info //= q{};
- $routeinfo //= q{};
-
- for my $str ( $time, $train, $dest, $platform, $info, $routeinfo ) {
- $str =~ s/\n/ /mg;
- $str =~ tr/ //s;
- $str =~ s/^ +//;
- $str =~ s/ +$//;
- }
-
- while ( $route =~ m{$re_via}g ) {
- if ($first) {
- $first = 0;
- next;
- }
-
- if ( $+{stop} =~ m{ [(] Halt \s entf.llt [)] }ox ) {
- next;
- }
-
- push( @via, [ $+{time}, $+{stop} ] );
- }
-
- push(
- @{ $self->{results} },
- Travel::Status::DE::DeutscheBahn::Result->new(
- date => $date,
- time => $time,
- train => $train,
- route_raw => $route,
- route => \@via,
- route_end => $dest,
- platform => $platform,
- info_raw => $info,
- routeinfo_raw => $routeinfo,
- )
- );
- }
-
- return @{ $self->{results} };
+ return $class->SUPER::new(%opt);
}
1;
@@ -264,14 +22,14 @@ __END__
=head1 NAME
-Travel::Status::DE::DeutscheBahn - Interface to the DeutscheBahn online
-arrival/departure monitor
+Travel::Status::DE::HAFAS - Interface to HAFAS-based online arrival/departure
+monitors
=head1 SYNOPSIS
- use Travel::Status::DE::DeutscheBahn;
+ use Travel::Status::DE::HAFAS;
- my $status = Travel::Status::DE::DeutscheBahn->new(
+ my $status = Travel::Status::DE::HAFAS->new(
station => 'Essen Hbf',
);
@@ -295,8 +53,8 @@ version 1.05
=head1 DESCRIPTION
-Travel::Status::DE::DeutscheBahn is an interface to the DeutscheBahn
-arrival/departure monitor available at
+Travel::Status::DE::DeutscheBahn is an interface to the Deutsche Bahn
+departure monitor available at
L<http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn>.
It takes a station name and (optional) date and time and reports all arrivals
@@ -310,67 +68,12 @@ unspecified).
=item my $status = Travel::Status::DE::DeutscheBahn->new(I<%opts>)
Requests the departures/arrivals as specified by I<opts> and returns a new
-Travel::Status::DE::DeutscheBahn element with the results. Dies if the wrong
+Travel::Status::DE::HAFAS element with the results. Dies if the wrong
I<opts> were passed.
-Supported I<opts> are:
-
-=over
-
-=item B<station> => I<station>
-
-The train station to report for, e.g. "Essen HBf" or
-"Alfredusbad, Essen (Ruhr)". Mandatory.
-
-=item B<date> => I<dd>.I<mm>.I<yyyy>
-
-Date to report for. Defaults to the current day.
-
-=item B<language> => I<language>
-
-Set language for additional information. Accepted arguments: B<d>eutsch,
-B<e>nglish, B<i>talian, B<n> (dutch).
-
-=item B<lwp_options> => I<\%hashref>
-
-Passed on to C<< LWP::UserAgent->new >>. Defaults to C<< { timeout => 10 } >>,
-you can use an empty hashref to override it.
-
-=item B<time> => I<hh>:I<mm>
-
-Time to report for. Defaults to now.
-
-=item B<mode> => B<arr>|B<dep>
-
-By default, Travel::Status::DE::DeutscheBahn reports train departures
-(B<dep>). Set this to B<arr> to get arrivals instead.
-
-=item B<mot> => I<\%hashref>
-
-Modes of transport to show. Accepted keys are: B<ice> (ICE trains), B<ic_ec>
-(IC and EC trains), B<d> (InterRegio and similarly fast trains), B<nv>
-("Nahverkehr", mostly RegionalExpress trains), B<s> ("S-Bahn"), B<bus>,
-B<ferry>, B<u> ("U-Bahn") and B<tram>.
-
-Setting a mode (as hash key) to 1 includes it, 0 excludes it. undef leaves it
-at the default.
-
-By default, the following are shown: ice, ic_ec, d, nv, s.
-
-=back
-
-=item $status->errstr
-
-In case of an error in the HTTP request, returns a string describing it. If
-no error occurred, returns undef.
-
-=item $status->results
-
-Returns a list of arrivals/departures. Each list element is a
-Travel::Status::DE::DeutscheBahn::Result(3pm) object.
-
-If no matching results were found or the parser / http request failed, returns
-undef.
+Calls Travel::Status::DE::HAFAS->new with service = DB. All I<opts> are passed
+on. Please see Travel::Status::DE::HAFAS(3pm) for I<opts> documentation
+and other methdos.
=back
@@ -386,21 +89,23 @@ None.
=item * LWP::UserAgent(3pm)
+=item * Travel::Status::DE::HAFAS(3pm)
+
=item * XML::LibXML(3pm)
=back
=head1 BUGS AND LIMITATIONS
-There are a few character encoding issues.
+Unknown.
=head1 SEE ALSO
-Travel::Status::DE::DeutscheBahn::Result(3pm).
+Travel::Status::DE::HAFAS(3pm).
=head1 AUTHOR
-Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
+Copyright (C) 2015 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
=head1 LICENSE
diff --git a/lib/Travel/Status/DE/DeutscheBahn/Result.pm b/lib/Travel/Status/DE/DeutscheBahn/Result.pm
deleted file mode 100644
index be9ec18..0000000
--- a/lib/Travel/Status/DE/DeutscheBahn/Result.pm
+++ /dev/null
@@ -1,365 +0,0 @@
-package Travel::Status::DE::DeutscheBahn::Result;
-
-use strict;
-use warnings;
-use 5.010;
-
-no if $] >= 5.018, warnings => "experimental::smartmatch";
-
-use parent 'Class::Accessor';
-
-our $VERSION = '1.05';
-
-Travel::Status::DE::DeutscheBahn::Result->mk_ro_accessors(
- qw(date time train route_end route_raw platform info_raw routeinfo_raw));
-
-sub new {
- my ( $obj, %conf ) = @_;
-
- my $ref = \%conf;
-
- return bless( $ref, $obj );
-}
-
-sub destination {
- my ($self) = @_;
-
- return $self->{route_end};
-}
-
-sub line {
- my ($self) = @_;
-
- return $self->{train};
-}
-
-sub info {
- my ($self) = @_;
-
- my $info = $self->info_raw;
-
- $info =~ s{ ,Grund }{}ox;
- $info =~ s{ ^ \s+ }{}ox;
- $info
- =~ s{ (?: ^ | , ) (?: p.nktlich | [nk] [.] [Aa] [.] | on \s time ) }{}ox;
- $info =~ s{ ^ , }{}ox;
-
- return $info;
-}
-
-sub delay {
- my ($self) = @_;
-
- my $info = $self->info_raw;
-
- if ( $info =~ m{ p.nktlich }ox ) {
- return 0;
- }
- if ( $info =~ m{ (?: ca \. \s* )? \+ (?<delay> \d+) :? \s* }ox ) {
- return $+{delay};
- }
-
- return;
-}
-
-sub is_cancelled {
- my ($self) = @_;
- my $info = $self->info_raw;
-
- if ( $info =~ m{ Fahrt \s f.llt \s aus }ox ) {
- return 1;
- }
- return 0;
-}
-
-sub origin {
- my ($self) = @_;
-
- return $self->{route_end};
-}
-
-sub route {
- my ($self) = @_;
-
- my @stops = map { $_->[1] } @{ $self->{route} };
- return @stops;
-}
-
-sub route_info {
- my ($self) = @_;
-
- my $route_info = $self->routeinfo_raw;
-
- $route_info =~ s{ ^ [\s\n]+ }{}x;
- $route_info =~ s{ [\s\n]+ $ }{}x;
-
- return $route_info;
-}
-
-sub route_interesting {
- my ( $self, $max_parts ) = @_;
-
- my @via = $self->route;
- my ( @via_main, @via_show, $last_stop );
- $max_parts //= 3;
-
- for my $stop (@via) {
- if ( $stop =~ m{ Hbf | Flughafen }ox ) {
- push( @via_main, $stop );
- }
- }
- $last_stop = pop(@via);
-
- if ( @via_main and $via_main[-1] eq $last_stop ) {
- pop(@via_main);
- }
-
- if ( @via_main and @via and $via[0] eq $via_main[0] ) {
- shift(@via_main);
- }
-
- if ( @via < $max_parts ) {
- @via_show = @via;
- }
- else {
- if ( @via_main >= $max_parts ) {
- @via_show = ( $via[0] );
- }
- else {
- @via_show = splice( @via, 0, $max_parts - @via_main );
- }
-
- while ( @via_show < $max_parts and @via_main ) {
- my $stop = shift(@via_main);
- if ( $stop ~~ \@via_show or $stop eq $last_stop ) {
- next;
- }
- push( @via_show, $stop );
- }
- }
-
- for (@via_show) {
- s{ ?Hbf}{};
- }
-
- return @via_show;
-
-}
-
-sub route_timetable {
- my ($self) = @_;
-
- return @{ $self->{route} };
-}
-
-sub TO_JSON {
- my ($self) = @_;
-
- return { %{$self} };
-}
-
-sub type {
- my ($self) = @_;
-
- # $self->{train} is either "TYPE 12345" or "TYPE12345"
- my ($type) = ( $self->{train} =~ m{ ^ ([A-Z]+) }x );
-
- return $type;
-}
-
-1;
-
-__END__
-
-=head1 NAME
-
-Travel::Status::DE::DeutscheBahn::Result - Information about a single
-arrival/departure received by Travel::Status::DE::DeutscheBahn
-
-=head1 SYNOPSIS
-
- for my $departure ($status->results) {
- printf(
- "At %s: %s to %s from platform %s\n",
- $departure->time,
- $departure->line,
- $departure->destination,
- $departure->platform,
- );
- }
-
- # or (depending on module setup)
- for my $arrival ($status->results) {
- printf(
- "At %s: %s from %s on platform %s\n",
- $arrival->time,
- $arrival->line,
- $arrival->origin,
- $arrival->platform,
- );
- }
-
-=head1 VERSION
-
-version 1.05
-
-=head1 DESCRIPTION
-
-Travel::Status::DE::DeutscheBahn::Result describes a single arrival/departure
-as obtained by Travel::Status::DE::DeutscheBahn. It contains information about
-the platform, time, route and more.
-
-=head1 METHODS
-
-=head2 ACCESSORS
-
-=over
-
-=item $result->date
-
-Arrival/Departure date in "dd.mm.yyyy" format.
-
-=item $result->delay
-
-Returns the train's delay in minutes, or undef if it is unknown.
-
-=item $result->info
-
-Returns additional information, for instance the reason why the train is
-delayed. May be an empty string if no (useful) information is available.
-
-=item $result->is_cancelled
-
-True if the train was cancelled, false otherwise.
-
-=item $result->line
-
-=item $result->train
-
-Returns the line name, either in a format like "S 1" (S-Bahn line 1)
-or "RE 10111" (RegionalExpress train 10111, no line information).
-
-=item $result->platform
-
-Returns the platform from which the train will depart / at which it will
-arrive.
-
-=item $result->route
-
-Returns a list of station names the train will pass between the selected
-station and its origin/destination.
-
-=item $result->route_end
-
-Returns the last element of the route. Depending on how you set up
-Travel::Status::DE::DeutscheBahn (arrival or departure listing), this is
-either the train's destination or its origin station.
-
-=item $result->destination
-
-=item $result->origin
-
-Convenience aliases for $result->route_end.
-
-=item $result->route_interesting([I<max>])
-
-Returns a list of up to I<max> (default: 3) interesting stations the train
-will pass on its journey. Since deciding whether a station is interesting or
-not is somewhat tricky, this feature should be considered experimental.
-
-The first element of the list is always the train's next stop. The following
-elements contain as many main stations as possible, but there may also be
-smaller stations if not enough main stations are available.
-
-In future versions, other factors may be taken into account as well. For
-example, right now airport stations are usually not included in this list,
-although they should be.
-
-Note that all main stations will be stripped of their "Hbf" suffix.
-
-=item $result->route_raw
-
-Returns the raw string used to create the route array.
-
-Note that cancelled stops are filtered from B<route>, but still present in
-B<route_raw>.
-
-=item $result->route_timetable
-
-Similar to B<route>. however, this function returns a list of array
-references of the form C<< [ arrival time, station name ] >>.
-
-=item $result->route_info
-
-Returns a string containing information related to the train's route, such as
-"landslide between X and Y, expect delays".
-
-=item $result->time
-
-Returns the arrival/departure time as string in "hh:mm" format.
-
-=item $result->type
-
-Returns the type of this train, e.g. "S" for S-Bahn, "RE" for Regional Express
-or "ICE" for InterCity-Express.
-
-=back
-
-=head2 INTERNAL
-
-=over
-
-=item $result = Travel::Status::DE::DeutscheBahn::Result->new(I<%data>)
-
-Returns a new Travel::Status::DE::DeutscheBahn::Result object.
-You usually do not need to call this.
-
-Required I<data>:
-
-=over
-
-=item B<time> => I<hh:mm>
-
-=item B<train> => I<string>
-
-=item B<route_raw> => I<string>
-
-=item B<route> => I<arrayref>
-
-=item B<route_end> => I<string>
-
-=item B<platform> => I<string>
-
-=item B<info_raw> => I<string>
-
-=back
-
-=back
-
-=head1 DIAGNOSTICS
-
-None.
-
-=head1 DEPENDENCIES
-
-=over
-
-=item Class::Accessor(3pm)
-
-=back
-
-=head1 BUGS AND LIMITATIONS
-
-None known.
-
-=head1 SEE ALSO
-
-Travel::Status::DE::DeutscheBahn(3pm).
-
-=head1 AUTHOR
-
-Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
-
-=head1 LICENSE
-
-This module is licensed under the same terms as Perl itself.
diff --git a/lib/Travel/Status/DE/HAFAS.pm b/lib/Travel/Status/DE/HAFAS.pm
new file mode 100644
index 0000000..d091f52
--- /dev/null
+++ b/lib/Travel/Status/DE/HAFAS.pm
@@ -0,0 +1,346 @@
+package Travel::Status::DE::HAFAS;
+
+use strict;
+use warnings;
+use 5.010;
+
+no if $] >= 5.018, warnings => "experimental::smartmatch";
+
+use Carp qw(confess);
+use LWP::UserAgent;
+use POSIX qw(strftime);
+use Travel::Status::DE::HAFAS::Result;
+use XML::LibXML;
+
+our $VERSION = '1.05';
+
+sub new {
+ my ( $obj, %conf ) = @_;
+
+ my $date = $conf{date} // strftime( '%d.%m.%Y', localtime(time) );
+ my $time = $conf{time} // strftime( '%H:%M', localtime(time) );
+ my $lang = $conf{language} // 'd';
+ my $mode = $conf{mode} // 'dep';
+ my $service = $conf{service} // 'DB';
+
+ my %lwp_options = %{ $conf{lwp_options} // { timeout => 10 } };
+
+ my $ua = LWP::UserAgent->new(%lwp_options);
+
+ $ua->env_proxy;
+
+ my $reply;
+
+ if ( not $conf{station} ) {
+ confess('You need to specify a station');
+ }
+
+ my $ref = {
+ active_service => $service,
+ developer_mode => $conf{developer_mode},
+ post => {
+ input => $conf{station},
+ date => $date,
+ time => $time,
+ start => 'yes', # value doesn't matter, just needs to be set
+ boardType => $mode,
+ L => 'vs_java3',
+ },
+ service => {
+ DB => {
+ url => 'http://reiseauskunft.bahn.de/bin/bhftafel.exe',
+ name => 'Deutsche Bahn',
+ productbits =>
+ [qw[ice ic_ec d nv s bus ferry u tram ondemand x x x x]],
+ }
+ },
+ };
+
+ bless( $ref, $obj );
+
+ $ref->set_productfilter;
+
+ my $url = $ref->{service}{$service}{url} . '/' . $lang . 'n';
+
+ $reply = $ua->post( $url, $ref->{post} );
+
+ if ( $reply->is_error ) {
+ $ref->{errstr} = $reply->status_line;
+ return $ref;
+ }
+
+ # the interface does not return valid XML (but it's close!)
+ $ref->{raw_xml}
+ = '<?xml version="1.0" encoding="iso-8859-15"?><wrap>'
+ . $reply->content
+ . '</wrap>';
+
+ if ( $ref->{developer_mode} ) {
+ say $ref->{raw_xml};
+ }
+
+ $ref->{tree} = XML::LibXML->load_xml(
+ string => $ref->{raw_xml},
+
+ # recover => 2,
+ # suppress_errors => 1,
+ # suppress_warnings => 1,
+ );
+
+ if ( $ref->{developer_mode} ) {
+ say $ref->{tree}->toString(1);
+ }
+
+ $ref->check_input_error;
+ return $ref;
+}
+
+sub set_productfilter {
+ my ($self) = @_;
+
+ my $service = $self->{active_service};
+
+ $self->{post}{productsFilter}
+ = '1' x ( scalar @{ $self->{service}{$service}{productbits} } );
+}
+
+sub check_input_error {
+ my ($self) = @_;
+
+ my $xp_err = XML::LibXML::XPathExpression->new('//Err');
+ my $err = ( $self->{tree}->findnodes($xp_err) )[0];
+
+ if ($err) {
+ $self->{errstr}
+ = $err->getAttribute('text')
+ . ' (code '
+ . $err->getAttribute('code') . ')';
+ }
+
+ return;
+}
+
+sub errstr {
+ my ($self) = @_;
+
+ return $self->{errstr};
+}
+
+sub results {
+ my ($self) = @_;
+ my $mode = $self->{post}->{boardType};
+
+ my $xp_element = XML::LibXML::XPathExpression->new('//Journey');
+ my $xp_msg = XML::LibXML::XPathExpression->new('./HIMMessage');
+
+ if ( defined $self->{results} ) {
+ return @{ $self->{results} };
+ }
+ if ( not defined $self->{tree} ) {
+ return;
+ }
+
+ $self->{results} = [];
+
+ for my $tr ( @{ $self->{tree}->findnodes($xp_element) } ) {
+
+ my @message_nodes = $tr->findnodes($xp_msg);
+ my $train = $tr->getAttribute('prod');
+ my $time = $tr->getAttribute('fpTime');
+ my $date = $tr->getAttribute('fpDate');
+ my $dest = $tr->getAttribute('targetLoc');
+ my $platform = $tr->getAttribute('platform');
+ my $new_platform = $tr->getAttribute('newpl');
+ my $delay = $tr->getAttribute('delay');
+ my $e_delay = $tr->getAttribute('e_delay');
+ my $info = $tr->getAttribute('delayReason');
+ my $routeinfo = $tr->textContent;
+ my @messages;
+
+ if ( not( $time and $dest ) ) {
+ next;
+ }
+
+ for my $n (@message_nodes) {
+ push( @messages, $n->getAttribute('header') );
+ }
+
+ substr( $date, 6, 0 ) = '20';
+
+ $info //= q{};
+ $routeinfo //= q{};
+
+ $train =~ s{#.*$}{};
+
+ push(
+ @{ $self->{results} },
+ Travel::Status::DE::HAFAS::Result->new(
+ date => $date,
+ raw_delay => $delay,
+ raw_e_delay => $e_delay,
+ messages => \@messages,
+ time => $time,
+ train => $train,
+ route_end => $dest,
+ platform => $platform,
+ new_platform => $new_platform,
+ info => $info,
+ routeinfo_raw => $routeinfo,
+ )
+ );
+ }
+
+ return @{ $self->{results} };
+}
+
+# static
+sub get_services {
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Travel::Status::DE::HAFAS - Interface to HAFAS-based online arrival/departure
+monitors
+
+=head1 SYNOPSIS
+
+ use Travel::Status::DE::HAFAS;
+
+ my $status = Travel::Status::DE::HAFAS->new(
+ station => 'Essen Hbf',
+ );
+
+ if (my $err = $status->errstr) {
+ die("Request error: ${err}\n");
+ }
+
+ for my $departure ($status->results) {
+ printf(
+ "At %s: %s to %s from platform %s\n",
+ $departure->time,
+ $departure->line,
+ $departure->destination,
+ $departure->platform,
+ );
+ }
+
+=head1 VERSION
+
+version 1.05
+
+=head1 DESCRIPTION
+
+Travel::Status::DE::HAFAS is an interface to HAFAS-based
+arrival/departure monitors, for instance the one available at
+L<http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn>.
+
+It takes a station name and (optional) date and time and reports all arrivals
+or departures at that station starting at the specified point in time (now if
+unspecified).
+
+=head1 METHODS
+
+=over
+
+=item my $status = Travel::Status::DE::HAFAS->new(I<%opts>)
+
+Requests the departures/arrivals as specified by I<opts> and returns a new
+Travel::Status::DE::HAFAS element with the results. Dies if the wrong
+I<opts> were passed.
+
+Supported I<opts> are:
+
+=over
+
+=item B<station> => I<station>
+
+The train station to report for, e.g. "Essen HBf" or
+"Alfredusbad, Essen (Ruhr)". Mandatory.
+
+=item B<date> => I<dd>.I<mm>.I<yyyy>
+
+Date to report for. Defaults to the current day.
+
+=item B<language> => I<language>
+
+Set language for additional information. Accepted arguments: B<d>eutsch,
+B<e>nglish, B<i>talian, B<n> (dutch).
+
+=item B<lwp_options> => I<\%hashref>
+
+Passed on to C<< LWP::UserAgent->new >>. Defaults to C<< { timeout => 10 } >>,
+you can use an empty hashref to override it.
+
+=item B<time> => I<hh>:I<mm>
+
+Time to report for. Defaults to now.
+
+=item B<mode> => B<arr>|B<dep>
+
+By default, Travel::Status::DE::HAFAS reports train departures
+(B<dep>). Set this to B<arr> to get arrivals instead.
+
+=item B<mot> => I<\%hashref>
+
+Modes of transport to show. Accepted keys are: B<ice> (ICE trains), B<ic_ec>
+(IC and EC trains), B<d> (InterRegio and similarly fast trains), B<nv>
+("Nahverkehr", mostly RegionalExpress trains), B<s> ("S-Bahn"), B<bus>,
+B<ferry>, B<u> ("U-Bahn") and B<tram>.
+
+Setting a mode (as hash key) to 1 includes it, 0 excludes it. undef leaves it
+at the default.
+
+By default, the following are shown: ice, ic_ec, d, nv, s.
+
+=back
+
+=item $status->errstr
+
+In case of an error in the HTTP request, returns a string describing it. If
+no error occurred, returns undef.
+
+=item $status->results
+
+Returns a list of arrivals/departures. Each list element is a
+Travel::Status::DE::HAFAS::Result(3pm) object.
+
+If no matching results were found or the parser / http request failed, returns
+undef.
+
+=back
+
+=head1 DIAGNOSTICS
+
+None.
+
+=head1 DEPENDENCIES
+
+=over
+
+=item * Class::Accessor(3pm)
+
+=item * LWP::UserAgent(3pm)
+
+=item * XML::LibXML(3pm)
+
+=back
+
+=head1 BUGS AND LIMITATIONS
+
+Unknown.
+
+=head1 SEE ALSO
+
+Travel::Status::DE::HAFAS::Result(3pm).
+
+=head1 AUTHOR
+
+Copyright (C) 2015 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
+
+=head1 LICENSE
+
+This module is licensed under the same terms as Perl itself.
diff --git a/lib/Travel/Status/DE/HAFAS/Result.pm b/lib/Travel/Status/DE/HAFAS/Result.pm
new file mode 100644
index 0000000..f2aee63
--- /dev/null
+++ b/lib/Travel/Status/DE/HAFAS/Result.pm
@@ -0,0 +1,277 @@
+package Travel::Status::DE::HAFAS::Result;
+
+use strict;
+use warnings;
+use 5.010;
+
+no if $] >= 5.018, warnings => 'experimental::smartmatch';
+
+use parent 'Class::Accessor';
+
+our $VERSION = '1.05';
+
+Travel::Status::DE::HAFAS::Result->mk_ro_accessors(
+ qw(date info raw_e_delay raw_delay time train route_end info_raw));
+
+sub new {
+ my ( $obj, %conf ) = @_;
+
+ my $ref = \%conf;
+
+ return bless( $ref, $obj );
+}
+
+sub delay {
+ my ($self) = @_;
+
+ if ( defined $self->{raw_e_delay} ) {
+ return $self->{raw_e_delay};
+ }
+ if ( defined $self->{raw_delay}
+ and $self->{raw_delay} ne q{-}
+ and $self->{raw_delay} ne 'cancel' )
+ {
+ return $self->{raw_delay};
+ }
+ return;
+}
+
+sub destination {
+ my ($self) = @_;
+
+ return $self->{route_end};
+}
+
+sub line {
+ my ($self) = @_;
+
+ return $self->{train};
+}
+
+sub is_cancelled {
+ my ($self) = @_;
+
+ if ( $self->{raw_delay} and $self->{raw_delay} eq 'cancel' ) {
+ return 1;
+ }
+ return 0;
+}
+
+sub is_changed_platform {
+ my ($self) = @_;
+
+ if ( defined $self->{new_platform} and defined $self->{platform} ) {
+ if ( $self->{new_platform} ne $self->{platform} ) {
+ return 1;
+ }
+ return 0;
+ }
+ if ( defined $self->{net_platform} ) {
+ return 1;
+ }
+
+ return 0;
+}
+
+sub messages {
+ my ($self) = @_;
+
+ if ( $self->{messages} ) {
+ return @{ $self->{messages} };
+ }
+ return;
+}
+
+sub origin {
+ my ($self) = @_;
+
+ return $self->{route_end};
+}
+
+sub platform {
+ my ($self) = @_;
+
+ return $self->{new_platform} // $self->{platform};
+}
+
+sub TO_JSON {
+ my ($self) = @_;
+
+ return { %{$self} };
+}
+
+sub type {
+ my ($self) = @_;
+
+ # $self->{train} is either "TYPE 12345" or "TYPE12345"
+ my ($type) = ( $self->{train} =~ m{ ^ ([[:upper:]]+) }x );
+
+ return $type;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Travel::Status::DE::HAFAS::Result - Information about a single
+arrival/departure received by Travel::Status::DE::HAFAS
+
+=head1 SYNOPSIS
+
+ for my $departure ($status->results) {
+ printf(
+ "At %s: %s to %s from platform %s\n",
+ $departure->time,
+ $departure->line,
+ $departure->destination,
+ $departure->platform,
+ );
+ }
+
+ # or (depending on module setup)
+ for my $arrival ($status->results) {
+ printf(
+ "At %s: %s from %s on platform %s\n",
+ $arrival->time,
+ $arrival->line,
+ $arrival->origin,
+ $arrival->platform,
+ );
+ }
+
+=head1 VERSION
+
+version 1.05
+
+=head1 DESCRIPTION
+
+Travel::Status::DE::HAFAS::Result describes a single arrival/departure
+as obtained by Travel::Status::DE::HAFAS. It contains information about
+the platform, time, route and more.
+
+=head1 METHODS
+
+=head2 ACCESSORS
+
+=over
+
+=item $result->date
+
+Arrival/Departure date in "dd.mm.yyyy" format.
+
+=item $result->delay
+
+Returns the train's delay in minutes, or undef if it is unknown.
+Also returns undef if the train has been cancelled.
+
+=item $result->info
+
+Returns additional information, for instance the most recent delay reason.
+Returns an empty string if no (useful) information is available.
+
+=item $result->is_cancelled
+
+True if the train was cancelled, false otherwise.
+
+=item $result->is_changed_platform
+
+True if the platform (as returned by the B<platform> accessor) is not the
+scheduled one. Note that the scheduled platform is unknown in this case.
+
+=item $result->messages
+
+Returns a list of message strings related to this train. Messages usually are
+service notices (e.g. "missing carriage") or detailed delay reasons
+(e.g. "switch damage between X and Y, expect delays").
+
+=item $result->line
+
+=item $result->train
+
+Returns the line name, either in a format like "S 1" (S-Bahn line 1)
+or "RE 10111" (RegionalExpress train 10111, no line information).
+
+=item $result->platform
+
+Returns the platform from which the train will depart / at which it will
+arrive. Realtime data if available, schedule data otherwise.
+
+=item $result->route_end
+
+Returns the last element of the route. Depending on how you set up
+Travel::Status::DE::HAFAS (arrival or departure listing), this is
+either the train's destination or its origin station.
+
+=item $result->destination
+
+=item $result->origin
+
+Convenience aliases for C<< $result->route_end >>.
+
+=item $result->time
+
+Returns the arrival/departure time as string in "hh:mm" format.
+
+=item $result->type
+
+Returns the type of this train, e.g. "S" for S-Bahn, "RE" for Regional Express
+or "ICE" for InterCity-Express.
+
+=back
+
+=head2 INTERNAL
+
+=over
+
+=item $result = Travel::Status::DE::HAFAS::Result->new(I<%data>)
+
+Returns a new Travel::Status::DE::HAFAS::Result object.
+You usually do not need to call this.
+
+Required I<data>:
+
+=over
+
+=item B<time> => I<hh:mm>
+
+=item B<train> => I<string>
+
+=item B<route_end> => I<string>
+
+=item B<platform> => I<string>
+
+=item B<info_raw> => I<string>
+
+=back
+
+=back
+
+=head1 DIAGNOSTICS
+
+None.
+
+=head1 DEPENDENCIES
+
+=over
+
+=item Class::Accessor(3pm)
+
+=back
+
+=head1 BUGS AND LIMITATIONS
+
+None known.
+
+=head1 SEE ALSO
+
+Travel::Status::DE::HAFAS(3pm).
+
+=head1 AUTHOR
+
+Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
+
+=head1 LICENSE
+
+This module is licensed under the same terms as Perl itself.
diff --git a/t/20-db.t b/t/20-db.t
deleted file mode 100644
index e90f853..0000000
--- a/t/20-db.t
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env perl
-use strict;
-use warnings;
-use 5.010;
-
-use File::Slurp qw(slurp);
-use Test::More tests => 98;
-
-BEGIN {
- use_ok('Travel::Status::DE::DeutscheBahn');
-}
-require_ok('Travel::Status::DE::DeutscheBahn');
-
-my $html = slurp('t/in/essen.html');
-
-my $status = Travel::Status::DE::DeutscheBahn->new_from_html(html => $html);
-
-isa_ok($status, 'Travel::Status::DE::DeutscheBahn');
-can_ok($status, qw(results));
-
-my @departures = $status->results;
-
-for my $departure (@departures) {
- isa_ok($departure, 'Travel::Status::DE::DeutscheBahn::Result');
- can_ok($departure, qw(date route_end destination origin info platform route
- route_raw time train));
-}
-
-is($departures[0]->date, '06.07.2011', 'first result: date ok');
-is($departures[0]->time, '19:21', 'first result: time ok');
-is($departures[0]->train, 'RE 10228', 'first result: train ok');
-is($departures[0]->destination, 'Duisburg Hbf', 'first result: destination ok');
-is($departures[0]->platform, '2', 'first result: platform ok');
-is($departures[0]->delay, 0, 'first result: delay ok');
-
-is($departures[-1]->time, '20:18', 'last result: time ok');
-is($departures[-1]->train, 'S 6', 'last result: train ok');
-is($departures[-1]->platform, '12', 'last result: platform ok');
-
-is($departures[8]->time, '19:31', '9th result: time ok');
-is($departures[8]->train, 'NWB75366', '9th result: train ok');
-is($departures[8]->info_raw, 'k.A.', '9th result: info_raw ok');
-is($departures[8]->info, q{}, '9th result: info ok');
-is($departures[8]->delay, undef, '9th result: delay ok');
-
-is($departures[15]->delay, 15, '16th result: delay ok');
-
-is_deeply([$departures[8]->route],
- ['Essen-Borbeck', 'Bottrop Hbf', 'Gladbeck West', 'Gladbeck-Zweckel',
- 'Feldhausen', 'Dorsten', 'Hervest-Dorsten', 'Deuten', 'Rhade',
- 'Marbeck-Heiden', 'Borken(Westf)'], '9th result: route ok');
-
-is_deeply([$departures[8]->route_timetable],
- [
- ['19:36', 'Essen-Borbeck'],
- ['19:43', 'Bottrop Hbf'],
- ['19:50', 'Gladbeck West'],
- ['19:53', 'Gladbeck-Zweckel'],
- ['19:56', 'Feldhausen'],
- ['20:01', 'Dorsten'],
- ['20:05', 'Hervest-Dorsten'],
- ['20:10', 'Deuten'],
- ['20:15', 'Rhade'],
- ['20:21', 'Marbeck-Heiden'],
- ['20:27', 'Borken(Westf)'],
- ],
- '9th result: route_timetable ok');
-
-is_deeply([$departures[5]->route_interesting(3)],
- ['Essen-Steele', 'Essen-Steele Ost', 'Bochum'],
- '6th result: route_interesting(3) ok');
-
-is_deeply([$departures[7]->route_interesting(3)],
- ['Wattenscheid', 'Bochum', 'Dortmund'],
- '8th result: route_interesting(3) ok');
-
-is_deeply([$departures[10]->route_interesting(5)],
- [qw[Wattenscheid Bochum Witten Hagen]],
- '11th result: route_interesting(5) ok');
diff --git a/t/in/essen.html b/t/in/essen.html
deleted file mode 100644
index 246b430..0000000
--- a/t/in/essen.html
+++ /dev/null
@@ -1,2609 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>DB BAHN - Haltestelleninformationen - Ausgabe</title>
-<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
-<link rel="shortcut icon" href="/v/820/img/favicon.ico" />
-<link rel="stylesheet" type="text/css" href="/v/820/css/hafas.css" />
-<link rel="stylesheet" type="text/css" href="/v/760/cms/css/bahn.min.css" />
-<!--[if lte IE 6]>
-<link href="/v/760/cms/css/bahn-ie6.min.css" rel="stylesheet" type="text/css" />
-<![endif]-->
-<!--[if IE 7]>
-<link href="/v/760/cms/css/bahn-ie7.min.css" rel="stylesheet" type="text/css" />
-<![endif]-->
-<!--[if lte IE 7]>
-<link href="/v/800/css/hafas-ie.css" rel="stylesheet" type="text/css" />
-<![endif]-->
-<script type="text/javascript">
-// <![CDATA[
-var BAHNCSS = {
-load: function( type ) {
-var scriptStyles = document.createElement( 'link' );
-scriptStyles.rel = 'stylesheet';
-scriptStyles.type = 'text/css';
-if(type == 'hafasDynamic')
-scriptStyles.href = '/v/820/css/hafas-dyn.css';
-else
-scriptStyles.href = '/v/760/cms/css/bahn-dyn.min.css';
-scriptStyles.media = 'screen, projection, handheld, print';
-if ( head = document.getElementsByTagName( 'head' )[0] ) {
-head.appendChild( scriptStyles );
-}
-}
-}
-BAHNCSS.load( 'dynamicCSS' );
-BAHNCSS.load( 'hafasDynamic' );
-// ]]>
-</script>
-<style type="text/css">
-<!--
--->
-</style>
-<!--[if lte IE 6]>
-<style type="text/css">
-body {behavior:url("/v/600/css/hafas-dyn-hover.htc");}
-</style>
-<![endif]-->
-<script type="text/javascript" src="/v/760/js/external.js"></script>
-<script type="text/javascript" src="/v/820/js/hafas_tp.js"></script>
-<script type="text/javascript" src="/v/760/js/simple_ajax.js"></script>
-<script type="text/javascript">
-<!--
-var tmpDiv = document.createElement("div");
-tmpDiv.innerHTML = "Frage oder Suchbegriff eingeben &hellip;";
-var searchDefault = tmpDiv.innerHTML;
-var defaultString = new Array("",searchDefault);
-var inputFields = new Array({"name":"q","strIndex":1});
-var defaultStringIndex = new Object();
-function sHC(link, name, evaId, time)
-{
-if(document.getElementById("hafasConMenu") != null)
-delConMenu("hafasConMenu","hafasConMenu");
-var menuContainer = document.createElement("div");
-menuContainer.id = "hafasConMenu";
-menuContainer.className = "hafasMenuContainer dep";
-menuContainer.innerHTML = "<div class='floatRight' onclick='delConMenu(\"hafasConMenu\")'><img src='/v/820/img/schliessen_outline_10x10.gif' \/></div>";
-menuContainer.innerHTML += "<div class='dep'><a class='arrowlink' href='http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;country=DEU&amp;rt=1&amp;evaId="+evaId+"&amp;boardType=dep&amp;time="+time+"&amp;productsFilter=11111&amp;start=yes'>Abfahrtsplan</a></div>";
-if(evaId.substr(0,2) == "80")
-menuContainer.innerHTML += "<div class='dep'><a class='arrowlink' href='http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;country=DEU&amp;rt=1&amp;showBhfInfo=yes&amp;evaId="+evaId+"&amp;info=yes&amp;' target='stationinfo' onclick='blur();popUp(\"about:blank\",\"stationinfo\",\"stInfo\");'>Bahnhofsinformationen</a></div>";
-var currentNode = link;
-var offsetTop = link.offsetHeight+3;
-var offsetLeft = -10;
-while(currentNode)
-{
-offsetTop += currentNode.offsetTop;
-offsetLeft += currentNode.offsetLeft;
-currentNode = currentNode.offsetParent;
-}
-menuContainer.style.top = offsetTop+"px";
-menuContainer.style.left = offsetLeft+"px";
-document.getElementsByTagName("body")[0].appendChild(menuContainer);
-}
-function delConMenu(menuContainer)
-{
-//document.getElementById(mbsContainer).removeChild(document.getElementById(menuContainer));
-document.getElementsByTagName("body")[0].removeChild(document.getElementById(menuContainer));
-}
-//-->
-</script>
-<script type="text/javascript" src="/v/800/js/FSuggest.js"></script>
-<script type="text/javascript" src="/v/760/js/hafas_standard_calendar_combined.js"></script>
-<link rel="stylesheet" type="text/css" href="/v/760/cms/css/bahn_calendar_div.css" />
-<script type="text/javascript">
-<!--
-function markarrowlink(button) {
-button.style.color="#f00";
-button.style.textDecoration = "underline";
-}
-function resetarrowlink(button) {
-button.style.color="#000";
-button.style.textDecoration = "none";
-}
-// -->
-</script>
-</head>
-<body onload="removeDefaultValues(false);initFontsize();" style="">
-<div id="doc" style="height:100%;">
-<div id="header" >
-<h1 id="logo">
-<img src="/v/820/img/logo-db-bahn.gif" width="126" height="32" alt="DB Bahn" />
-</h1>
-<div id="header-elements" class="clearfix">
-<form id="search" action="http://www.bahn.de/q" method="get" accept-charset="ISO-8859-1" target="_blank">
-<fieldset>
-<p>
-<label for="search-query">Suchen</label>
-<input id="search-query" type="text" name="q" title="Suche" maxlength="500" value="Frage oder Suchbegriff eingeben &hellip;" class="search-field hasDefault" tabindex="80" role="search" />
-<input id="search-site" type="hidden" name="s" value="p,international,regional" />
-<input id="search-lang" type="hidden" name="l" value="de" />
-<input id="search-maxresults" type="hidden" name="m" value="100" />
-<input type="hidden" disabled="disabled" id="search-query-default" value="Frage oder Suchbegriff eingeben &hellip;" />
-<input type="hidden" disabled="disabled" id="search-query-load-query" value="&amp;height=600&amp;width=657&amp;inlineId=hiddenModalContent&amp;modal=false" />
-</p>
-<!-- Submit -->
-<p class="button-inside">
-<span class="button-border button-normal">
-<noscript>
-<input type="submit" class="button deleteDefaults" name="start" value="Suchen" title="Suchen" />
-</noscript>
-<script type="text/javascript">
-<!--
-document.write('<button type="submit" name="search-submit" tabindex="90">Suchen</button>');
-//-->
-</script>
-</span>
-</p>
-</fieldset>
-</form>
-<ul id="service-nav" class="clearfix">
-<li><a href="http://www.bahn.de/app_kontakt_pk_de_DEU.shtml" tabindex="10" target="_blank" class="first">Kontakt</a></li>
-<li><a href="http://www.bahn.de/app_hilfe_pk_de_DEU.shtml" tabindex="20" target="_blank" >Hilfe</a></li>
-<li><a href="http://www.bahn.de/app_sitemap_pk_de_DEU.shtml" tabindex="30" target="_blank">Sitemap</a></li>
-<li id="font-sizer">
-<a href="http://reiseauskunft.bahn.de/bin/bhftafel.exe?input=Essen+Hbf&amp;GUIREQProduct_2=on&amp;time=19%3A19&amp;date=06.07.2011&amp;REQTrain_name=&amp;GUIREQProduct_4=on&amp;boardType=dep&amp;GUIREQProduct_1=on&amp;GUIREQProduct_3=on&amp;GUIREQProduct_0=on&amp;advancedProductMode=&amp;start=Suchen&amp;&amp;font-size=0" tabindex="40" class="font-normal" title="Schrift normal">a</a><span>,</span>
-<a href="http://reiseauskunft.bahn.de/bin/bhftafel.exe?input=Essen+Hbf&amp;GUIREQProduct_2=on&amp;time=19%3A19&amp;date=06.07.2011&amp;REQTrain_name=&amp;GUIREQProduct_4=on&amp;boardType=dep&amp;GUIREQProduct_1=on&amp;GUIREQProduct_3=on&amp;GUIREQProduct_0=on&amp;advancedProductMode=&amp;start=Suchen&amp;&amp;font-size=1" tabindex="50" class="font-large" title="Schrift gr&#246;&#223;er">a+</a><span>,</span>
-<a href="http://reiseauskunft.bahn.de/bin/bhftafel.exe?input=Essen+Hbf&amp;GUIREQProduct_2=on&amp;time=19%3A19&amp;date=06.07.2011&amp;REQTrain_name=&amp;GUIREQProduct_4=on&amp;boardType=dep&amp;GUIREQProduct_1=on&amp;GUIREQProduct_3=on&amp;GUIREQProduct_0=on&amp;advancedProductMode=&amp;start=Suchen&amp;&amp;font-size=2" tabindex="60" class="font-xl" title="Schrift extra gro&#223;">a++</a>
-</li>
-</ul>
-</div>
-</div>
-<div id="main-nav" class="clearfix">
-<h2>Hauptnavigation</h2>
-<div id="nav1">
-<ul id="main-nav-left">
-<li id="mn-startseite"><a class="first jhover" href="http://www.bahn.de/app_home_pk_de_DEU.shtml" title="Startseite" ><span>Startseite</span></a></li>
-<li id="mn-angebotsberatung">
-<a class="jhover" href="http://www.bahn.de/app_angebote_pk_de_DEU.shtml" title="Angebotsberatung" ><span>Angebotsberatung</span></a>
-</li>
-<li id="mn-fahrplan">
-<a class="jhover active" href="http://www.bahn.de/app_buchen_pk_de_DEU.shtml" title="Fahrplan &amp; Buchung" ><span>Fahrplan &amp; Buchung</span></a>
-</li>
-<li id="mn-services">
-<a class="jhover" href="http://www.bahn.de/app_services_pk_de_DEU.shtml" title="Services" ><span>Services</span></a>
-</li>
-<li id="mn-bahncard">
-<a class="jhover" href="http://www.bahn.de/app_bahncard_pk_de_DEU.shtml" title="BahnCard" ><span>BahnCard</span></a>
-</li>
-<li id="mn-urlaub">
-<a class="jhover" href="http://www.bahn.de/app_urlaub_pk_de_DEU.shtml" title="Urlaub" ><span>Urlaub</span></a>
-</li>
-</ul>
-<form id="login-form" action="#" method="post">
-<ul id="main-nav-right">
-<li id="mn-meinebahn"><a class="first " href="https://fahrkarten.bahn.de/privatkunde/start/start.post?lang=de&amp;country=DEU&amp;scope=meinebahn" title="Meine Bahn"><span>Meine Bahn</span></a></li>
-</ul>
-</form>
-</div>
-</div>
-<div id="content" class="clearfix">
-<div id="key-visual">
-<div class="bar"></div>
-</div>
-<div id="hafasContainer">
-<div class="hafasContent sq_results">
-<h1 class="pagetitle">Abfahrt und Ankunft</h1>
-<form action="http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;country=DEU&amp;rt=1&amp;" name="formular" method="post" style="display:inline;" onsubmit="return replaceB();">
-<div id="sqQuery" class="clearfix">
-<div class="leftBlock">
-<fieldset>
-<label class="front wrap" for="HFS_input">Bahnhof / Haltestelle</label>
-<input type="text" id="rplc0" name="input" value="Essen Hbf" size="40" maxlength="60" />
-<input type="hidden" name="inputRef" value="Essen Hbf#008000098" />
-<script type="text/javascript">
-<!--
-rplcArray = new Array();
-rplcArray[0] = "rplc0";
-new FSuggest({loc:"rplc0",
-type:"S",
-minChar:4,
-requestURL:"http://reiseauskunft.bahn.de/bin/ajax-getstop.exe/dn?REQ0JourneyStopsS0A=1&REQ0JourneyStopsS0G=",
-stopDelay:400,
-requestType:"js"
-});
-// -->
-</script>
-<br />
-</fieldset>
-<fieldset>
-<label class="front" for="HFS_selectDate">Datum / Zeit</label>
-<input class="emphasized" type="text" name="date" id="date" value="06.07.2011" size="10" maxlength="14" onblur="javascript:this.notify(this);"/> &nbsp;
-<span class="jsShowInline" style="position: relative;">
-<img id="calLater" class="calLater" src="/v/820/img/icons_16x8_up.gif" onclick="calman.shiftDate('callink0',1);" width="16" height="8" alt="Einen Tag sp&#228;ter" title="Einen Tag sp&#228;ter" />
-<img id="calSooner" class="calSooner" src="/v/820/img/icons_16x8_down.gif" onclick="calman.shiftDate('callink0',-1);" width="16" height="8" alt="Einen Tag fr&#252;her" title="Einen Tag fr&#252;her" />
-<script type="text/javascript">
-var monthsTexts = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
-var weekdayTexts = new Array("Mo","Di","Mi","Do","Fr","Sa","So");
-var closeText = "Schließen";
-</script>
-&nbsp;<a id="callink0" onclick="return calman.toggleDisplay('callink0');" class="calendar"><img src="/v/820/img/kalender_21x16.gif" width="21" height="16" title="Kalender" alt="Kalender" id="calendarlinkicon0"/></a>
-<script type="text/javascript">
-calman.config = {
-"today" : parseUserDateInput("06.07.11"),
-"viewPeriodS" : parseUserDateInput("12.12.10"),
-"viewPeriodE" : parseUserDateInput("10.12.11"),
-"dataPeriodS" : parseUserDateInput("12.12.10"),
-"dataPeriodE" : parseUserDateInput("10.12.11"),
-"monthsTexts" : monthsTexts,
-"weekdaysTexts" : weekdayTexts,
-"closeText" : closeText,
-"showShortYear" : true,
-"styleClass" : "calendardiv"
-}
-var calcon_config = {
-"formName" : "document.formular",
-"fieldName" : "date",
-"referenceObject" : "callink0"
-}
-calman.createCalendar(calcon_config);
-</script>
-</span>
-<input type="text" id="HFS_time" name="time" value="19:19" size="8" maxlength="20" />
-<span id="changeTime" class="nowrap jsShowInline nopadding sqTimeChange" style="position: relative; margin-left: 5px;">
-<img src="/v/820/img/icons_16x8_up.gif" onclick="shiftTime('HFS_time',1);" class="calLater" width="16" height="8" alt="Weiter zur vollen Stunde" title="Weiter zur vollen Stunde" />
-<img src="/v/820/img/icons_16x8_down.gif" onclick="shiftTime('HFS_time',-1);" class="calSooner" width="16" height="8" alt="Zur&#252;ck zur vollen Stunde" title="Zur&#252;ck zur vollen Stunde" />
-&nbsp;
-</span>
-<br />
-<input class="leftMargin radio" type="radio" id="dep" name="boardType" value="dep" checked="checked" /><label for="dep">Abfahrt</label>
-<input class="radio" type="radio" id="arr" name="boardType" value="arr" /><label for="arr">Ankunft</label>
-<br />
-</fieldset>
-</div>
-<div class="rightBlock">
-<fieldset>
-<label class="front" for="HFS_trainName">Linie / Zugnummer (optional)</label>
-<input type="text" id="HFS_trainName" name="REQTrain_name" value="" size="15" maxlength="15" />
-<br />
-</fieldset>
-<fieldset>
-<input type="hidden" name="advancedProductMode" />
-<label class="front" for="prod_0">Verkehrsmittel</label>
-<table class="products">
-<tr class="cb">
-<td>
-<input id="prod_0" class="checkbox " type="checkbox" name="GUIREQProduct_0" checked="checked" />
-</td>
-<td>
-<input id="prod_1" class="checkbox " type="checkbox" name="GUIREQProduct_1" checked="checked" />
-</td>
-<td>
-<input id="prod_2" class="checkbox " type="checkbox" name="GUIREQProduct_2" checked="checked" />
-</td>
-<td>
-<input id="prod_3" class="checkbox " type="checkbox" name="GUIREQProduct_3" checked="checked" />
-</td>
-<td>
-<input id="prod_4" class="checkbox " type="checkbox" name="GUIREQProduct_4" checked="checked" />
-</td>
-<td>
-<input id="prod_5" class="checkbox " type="checkbox" name="GUIREQProduct_5" />
-</td>
-<td>
-<input id="prod_6" class="checkbox " type="checkbox" name="GUIREQProduct_6" />
-</td>
-<td>
-<input id="prod_7" class="checkbox " type="checkbox" name="GUIREQProduct_7" />
-</td>
-<td>
-<input id="prod_8" class="checkbox " type="checkbox" name="GUIREQProduct_8" />
-</td>
-</tr>
-<tr class="icons">
-<td><img src="/v/820/img/ice_24x24.gif" alt="ICE-Z&#252;ge" title="ICE-Z&#252;ge" width="24" height="24" /></td>
-<td><img src="/v/820/img/ec_ic_24x24.gif" alt="Intercity- und Eurocityz&#252;ge" title="Intercity- und Eurocityz&#252;ge" width="24" height="24" /></td>
-<td><img src="/v/820/img/ir_24x24.gif" alt="Interregio- und Schnellz&#252;ge" title="Interregio- und Schnellz&#252;ge" width="24" height="24" /></td>
-<td><img src="/v/820/img/re_24x24.gif" alt="Nahverkehr, sonstige Z&#252;ge" title="Nahverkehr, sonstige Z&#252;ge" width="24" height="24" /></td>
-<td><img src="/v/820/img/sbahn_24x24.gif" alt="S-Bahn" title="S-Bahn" width="24" height="24" /></td>
-<td><img src="/v/820/img/bus_24x24.gif" alt="Busse" title="Busse" width="24" height="24" /></td>
-<td><img src="/v/820/img/faehre_24x24.gif" alt="Schiffe" title="Schiffe" width="24" height="24" /></td>
-<td><img src="/v/820/img/ubahn_24x24.gif" alt="U-Bahnen" title="U-Bahnen" width="24" height="24" /></td>
-<td><img src="/v/820/img/tram_24x24.gif" alt="Stra&#223;enbahnen" title="Stra&#223;enbahnen" width="24" height="24" /></td>
-</tr>
-</td>
-</table>
-</fieldset>
-</div>
-</div>
-<p class="floatRight button-inside querybutton">
-<span class="button-border">
-<button type="submit" class="highlight" name="start" value="Suchen" title="" />
-<span>Suchen</span>
-</button>
-</span>
-</p>
-<p class="button-inside clearfix querybutton">
-<span class="button-border button-normal">
-<a class="highlight" href="http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;country=DEU&amp;rt=1&amp;" title="Alle Eingaben l&#246;schen">Eingaben l&#246;schen</a>
-</span>
-</p>
-</form>
-</div>
-<div class="shadowbottom">&nbsp;</div>
-<div class="shadowtop">&nbsp;</div>
-<div id="sqResult" class="hafasContent">
-<h2>
-<a class="arrowlink floatRight fontNormal" href="http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;country=DEU&amp;rt=1&amp;input=Essen Hbf%238000098&amp;boardType=dep&amp;time=actual&amp;productsFilter=11111&amp;start=yes">Aktualisieren</a>
-<strong>Aktueller Abfahrtsplan von Essen Hbf um 19:19 Uhr</strong>
-</h2>
-<p>
-</p>
-<table class="result stboard dep">
-<tr>
-<th class="time">Zeit</th>
-<th class="icon">&nbsp;</th>
-<th class="train">Zug</th>
-<th class="route">Richtung / Unterwegshaltestellen</th>
-<th class="platform">Gleis</th>
-<th class="ris">Aktuelles</th>
-</tr>
-<tr class="browse">
-<td class="time">
-<a href="http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;country=DEU&amp;rt=1&amp;input=Essen Hbf%238000098&amp;boardType=dep&amp;time=19:19%2D60&amp;productsFilter=11111&amp;&amp;&amp;date=06.07.11&amp;selectDate=&amp;maxJourneys=&amp;start=yes" class="arrowlink arrowlinktop">fr&#252;her</a>
-</td>
-<td colspan="2" class="train">&nbsp;</td>
-<td class="route">
-</td>
-<td class="platform">&nbsp;</td>
-<td class="ris">&nbsp;</td>
-</tr>
-<tr class="current">
-<td class="time">19:19</td>
-<td class="train" colspan="2">aktuelle Uhrzeit</td>
-<td class="route">&nbsp;</td>
-<td class="track">&nbsp;</td>
-<td class="ris">&nbsp;</td>
-</tr>
-<tr>
-<td class="time">19:21</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/829575/383245/970550/208750/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:21&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/829575/383245/970550/208750/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:21&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10228
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000086','19:33'); return false;" href="/bin/bhftafel.exe/dn?input=Duisburg Hbf%238000086&amp;boardType=dep&amp;time=19:33&amp;productsFilter=11111&amp;start=yes">
-Duisburg Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:21
--
-M&#252;lheim(Ruhr)Hbf
-19:26
--
-Duisburg Hbf
-19:33
-</td>
-<td class="platform">
-<strong>2</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:21</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/950673/427599/812348/89295/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:21&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/950673/427599/812348/89295/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:21&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 9
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000047','19:37'); return false;" href="/bin/bhftafel.exe/dn?input=Bottrop Hbf%238000047&amp;boardType=dep&amp;time=19:37&amp;productsFilter=11111&amp;start=yes">
-Bottrop Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:21
--
-Essen West
-19:23
--
-Essen-Borbeck S&#252;d
-19:26
--
-Essen-Borbeck
-19:28
--
-Essen-Gerschede
-19:30
--
-Essen-Dellwig Ost
-19:33
--
-Bottrop Hbf
-19:37
-</td>
-<td class="platform">
-<strong>7</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:21</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/111342/147883/664506/295140/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:21&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/111342/147883/664506/295140/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:21&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 9
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000266','20:07'); return false;" href="/bin/bhftafel.exe/dn?input=Wuppertal Hbf%238000266&amp;boardType=dep&amp;time=20:07&amp;productsFilter=11111&amp;start=yes">
-Wuppertal Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:21
--
-Essen-Steele
-19:25
--
-Essen-&#220;berruhr
-19:28
--
-Essen-Holthausen
-19:30
--
-Essen-Kupferdreh
-19:33
--
-Velbert-Nierenhof
-19:38
--
-Velbert-Langenberg
-19:42
--
-Velbert-Neviges
-19:46
--
-Velbert Rosenh&#252;gel
-19:50
--
-W&#252;lfrath-Aprath
-19:53
--
-Wuppertal-Vohwinkel
-19:58
--
-Wuppertal-Sonnborn
-20:01
--
-Wuppertal-Zoologischer Garten
-20:02
--
-Wuppertal-Steinbeck
-20:05
--
-Wuppertal Hbf
-20:07
-</td>
-<td class="platform">
-<strong>11</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:21</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/234612/849968/953510/398551/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:21&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/234612/849968/953510/398551/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:21&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10228
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000085','19:53'); return false;" href="/bin/bhftafel.exe/dn?input=D&#252;sseldorf Hbf%238000085&amp;boardType=dep&amp;time=19:53&amp;productsFilter=11111&amp;start=yes">
-D&#252;sseldorf Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:21
--
-M&#252;lheim(Ruhr)Hbf
-19:26
--
-Duisburg Hbf
-19:33
--
-D&#252;sseldorf Flughafen
-19:45
--
-D&#252;sseldorf Hbf
-19:53
-</td>
-<td class="platform">
-<strong>2</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:26</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/432654/251439/745638/228601/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:26&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/432654/251439/745638/228601/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:26&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 3
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000286','19:43'); return false;" href="/bin/bhftafel.exe/dn?input=Oberhausen Hbf%238000286&amp;boardType=dep&amp;time=19:43&amp;productsFilter=11111&amp;start=yes">
-Oberhausen Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:26
--
-Essen West
-19:28
--
-Essen-Frohnhausen
-19:30
--
-M&#252;lheim(Ruhr)Hbf
-19:34
--
-M&#252;lheim(Ruhr)West
-19:37
--
-M&#252;lheim(Ruhr)Styrum
-19:39
--
-Oberhausen Hbf
-19:43
-</td>
-<td class="platform">
-<strong>7</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:26</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/62940/131335/800496/379269/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:26&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/62940/131335/800496/379269/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:26&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 1
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000080','20:06'); return false;" href="/bin/bhftafel.exe/dn?input=Dortmund Hbf%238000080&amp;boardType=dep&amp;time=20:06&amp;productsFilter=11111&amp;start=yes">
-Dortmund Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:26
--
-Essen-Steele
-19:29
--
-Essen-Steele Ost
-19:31
--
-Essen-Eiberg
-19:34
--
-Wattenscheid-H&#246;ntrop
-19:37
--
-Bochum-Ehrenfeld
-19:41
--
-Bochum Hbf
-19:43
--
-Bochum-Langendreer West
-19:48
--
-Bochum-Langendreer
-19:50
--
-Dortmund-Kley
-19:53
--
-Dortmund-Oespel
-19:55
--
-Dortmund Universit&#228;t
-19:58
--
-Dortmund-Dorstfeld S&#252;d
-20:00
--
-Dortmund-Dorstfeld
-20:02
--
-Dortmund Hbf
-20:06
-</td>
-<td class="platform">
-<strong>11</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:28</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/652038/324435/744806/155070/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:28&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/652038/324435/744806/155070/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:28&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 6
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8003372','21:08'); return false;" href="/bin/bhftafel.exe/dn?input=K&#246;ln-Nippes%238003372&amp;boardType=dep&amp;time=21:08&amp;productsFilter=11111&amp;start=yes">
-K&#246;ln-Nippes
-</a>
-</span>
-<br />
-Essen Hbf
-19:28
--
-Essen S&#252;d
-19:30
--
-Essen Stadtwald
-19:33
--
-Essen-H&#252;gel
-19:36
--
-Essen-Werden
-19:39
--
-Kettwig
-19:43
--
-Kettwig Stausee
-19:45
--
-H&#246;sel
-19:49
--
-Ratingen Ost
-19:54
--
-D&#252;sseldorf-Rath
-19:58
--
-D&#252;sseldorf-Rath Mitte
-20:01
--
-D&#252;sseldorf-Derendorf
-20:04
--
-D&#252;sseldorf-Zoo
-20:06
--
-D&#252;sseldorf Wehrhahn
-20:08
--
-D&#252;sseldorf Hbf
-20:10
--
-D&#252;sseldorf Volksgarten
-20:14
--
-D&#252;sseldorf-Oberbilk
-20:16
--
-D&#252;sseldorf-Eller S&#252;d
-20:19
--
-D&#252;sseldorf-Reisholz
-20:21
--
-D&#252;sseldorf-Benrath
-20:24
--
-D&#252;sseldorf-Garath
-20:27
--
-D&#252;sseldorf-Hellerhof
-20:29
--
-Langenfeld(Rhld)-Berghausen
-20:32
--
-Langenfeld(Rhld)
-20:34
--
-Leverkusen-Rheindorf
-20:38
--
-Leverkusen-K&#252;ppersteg
-20:41
--
-Leverkusen Mitte
-20:43
--
-Bayerwerk
-20:46
--
-K&#246;ln-Stammheim
-20:49
--
-K&#246;ln-M&#252;lheim
-20:53
--
-K&#246;ln-Buchforst
-20:56
--
-K&#246;ln Messe/Deutz Gl. 9-10
-21:00
--
-K&#246;ln Hbf
-21:03
--
-K&#246;ln Hansaring
-21:05
--
-K&#246;ln-Nippes
-21:08
-</td>
-<td class="platform">
-<strong>12</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:29</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/847062/392953/328812/117958/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:29&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/847062/392953/328812/117958/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:29&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10631
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000252','21:30'); return false;" href="/bin/bhftafel.exe/dn?input=Minden(Westf)%238000252&amp;boardType=dep&amp;time=21:30&amp;productsFilter=11111&amp;start=yes">
-Minden(Westf)
-</a>
-</span>
-<br />
-Essen Hbf
-19:29
--
-Wattenscheid
-19:34
--
-Bochum Hbf
-19:39
--
-Dortmund Hbf
-19:52
--
-Kamen
-20:03
--
-Hamm(Westf)
-20:13
--
-Heessen
-20:18
--
-Ahlen(Westf)
-20:23
--
-Neubeckum
-20:30
--
-Oelde
-20:36
--
-Rheda-Wiedenbr&#252;ck
-20:42
--
-G&#252;tersloh Hbf
-20:48
--
-Bielefeld Hbf
-20:58
--
-Herford
-21:07
--
-L&#246;hne(Westf)
-21:13
--
-Bad Oeynhausen
-21:18
--
-Porta Westfalica
-21:24
--
-Minden(Westf)
-21:30
-</td>
-<td class="platform">
-<strong>4</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:31</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/735006/382159/528888/19442/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:31&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/735006/382159/528888/19442/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:31&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-NWB75366
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000346','20:27'); return false;" href="/bin/bhftafel.exe/dn?input=Borken(Westf)%238000346&amp;boardType=dep&amp;time=20:27&amp;productsFilter=11111&amp;start=yes">
-Borken(Westf)
-</a>
-</span>
-<br />
-Essen Hbf
-19:31
--
-Essen-Borbeck
-19:36
--
-Bottrop Hbf
-19:43
--
-Gladbeck West
-19:50
--
-Gladbeck-Zweckel
-19:53
--
-Feldhausen
-19:56
--
-Dorsten
-20:01
--
-Hervest-Dorsten
-20:05
--
-Deuten
-20:10
--
-Rhade
-20:15
--
-Marbeck-Heiden
-20:21
--
-Borken(Westf)
-20:27
-</td>
-<td class="platform">
-<strong>8</strong><br />
-</td>
-<td class="ris">
-<span><span title="Es liegen keine aktuellen Informationen vor.">k.A.</span></span></td>
-</tr>
-<tr>
-<td class="time">19:32</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/934872/422339/473892/74683/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:32&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/934872/422339/473892/74683/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:32&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10630
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000085','20:05'); return false;" href="/bin/bhftafel.exe/dn?input=D&#252;sseldorf Hbf%238000085&amp;boardType=dep&amp;time=20:05&amp;productsFilter=11111&amp;start=yes">
-D&#252;sseldorf Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:32
--
-M&#252;lheim(Ruhr)Hbf
-19:37
--
-Duisburg Hbf
-19:44
--
-D&#252;sseldorf Flughafen
-19:56
--
-D&#252;sseldorf Hbf
-20:05
-</td>
-<td class="platform">
-<strong>2</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:34</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/287067/235284/57178/67100/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:34&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/287067/235284/57178/67100/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:34&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-ABR89480
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000046','21:54'); return false;" href="/bin/bhftafel.exe/dn?input=Siegen%238000046&amp;boardType=dep&amp;time=21:54&amp;productsFilter=11111&amp;start=yes">
-Siegen
-</a>
-</span>
-<br />
-Essen Hbf
-19:34
--
-Wattenscheid
-19:40
--
-Bochum Hbf
-19:46
--
-Witten Hbf
-19:56
--
-Wetter(Ruhr)
-20:01
--
-Hagen Hbf
-20:09
--
-Hohenlimburg
-20:25
--
-Letmathe
-20:30
--
-Altena(Westf)
-20:40
--
-Werdohl
-20:48
--
-Plettenberg
-20:55
--
-Finnentrop
-21:07
--
-Lennestadt-Grevenbr&#252;ck
-21:11
--
-Lennestadt-Meggen
-21:15
--
-Lennestadt-Altenhundem
-21:19
--
-Kirchhundem
-21:22
--
-Welschen Ennest
-21:30
--
-Kreuztal-Littfeld
-21:34
--
-Eichen(Kr Siegen)
-21:38
--
-Kreuztal
-21:41
--
-Siegen-Geisweid
-21:46
--
-Siegen-Weidenau
-21:49
--
-Siegen
-21:54
-</td>
-<td class="platform">
-<strong>9</strong><br />
-</td>
-<td class="ris">
-<span><span title="Es liegen keine aktuellen Informationen vor.">k.A.</span></span></td>
-</tr>
-<tr>
-<td class="time">19:34</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/980208/487956/578808/37332/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:34&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/980208/487956/578808/37332/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:34&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-ABR89540
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000186','20:42'); return false;" href="/bin/bhftafel.exe/dn?input=Iserlohn%238000186&amp;boardType=dep&amp;time=20:42&amp;productsFilter=11111&amp;start=yes">
-Iserlohn
-</a>
-</span>
-<br />
-Essen Hbf
-19:34
--
-Wattenscheid
-19:40
--
-Bochum Hbf
-19:46
--
-Witten Hbf
-19:56
--
-Wetter(Ruhr)
-20:01
--
-Hagen Hbf
-20:09
--
-Hohenlimburg
-20:25
--
-Letmathe
-20:30
--
-Letmathe Dechenh&#246;hle
-20:38
--
-Iserlohn
-20:42
-</td>
-<td class="platform">
-<strong>9</strong><br />
-</td>
-<td class="ris">
-<span><span title="Es liegen keine aktuellen Informationen vor.">k.A.</span></span></td>
-</tr>
-<tr>
-<td class="time">19:35</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/103056/142750/494120/212715/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:35&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/103056/142750/494120/212715/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:35&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 1
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000087','20:47'); return false;" href="/bin/bhftafel.exe/dn?input=Solingen Hbf%238000087&amp;boardType=dep&amp;time=20:47&amp;productsFilter=11111&amp;start=yes">
-Solingen Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:35
--
-Essen West
-19:37
--
-Essen-Frohnhausen
-19:40
--
-M&#252;lheim(Ruhr)Hbf
-19:45
--
-M&#252;lheim(Ruhr)Styrum
-19:48
--
-Duisburg Hbf
-19:53
--
-Duisburg-Schlenk
-19:57
--
-Duisburg-Buchholz
-20:00
--
-Duisburg-Gro&#223;enbaum
-20:02
--
-Duisburg-Rahm
-20:05
--
-Angermund
-20:07
--
-D&#252;sseldorf Flughafen
-20:11
--
-D&#252;sseldorf-Unterrath
-20:14
--
-D&#252;sseldorf-Derendorf
-20:17
--
-D&#252;sseldorf-Zoo
-20:19
--
-D&#252;sseldorf Wehrhahn
-20:21
--
-D&#252;sseldorf Hbf
-20:23
--
-D&#252;sseldorf Volksgarten
-20:26
--
-D&#252;sseldorf-Oberbilk
-20:28
--
-D&#252;sseldorf-Eller Mitte
-20:31
--
-D&#252;sseldorf-Eller
-20:33
--
-Hilden
-20:38
--
-Hilden S&#252;d
-20:40
--
-Solingen Vogelpark
-20:44
--
-Solingen Hbf
-20:47
-</td>
-<td class="platform">
-<strong>7</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:36</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/632781/319361/284026/68928/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:36&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/632781/319361/284026/68928/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:36&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 3
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8002640','19:55'); return false;" href="/bin/bhftafel.exe/dn?input=Hattingen(R) Mitte%238002640&amp;boardType=dep&amp;time=19:55&amp;productsFilter=11111&amp;start=yes">
-Hattingen(R) Mitte
-</a>
-</span>
-<br />
-Essen Hbf
-19:36
--
-Essen-Steele
-19:39
--
-Essen-Steele Ost
-19:42
--
-Essen-Horst
-19:44
--
-Bochum-Dahlhausen
-19:47
--
-Hattingen(Ruhr)
-19:52
--
-Hattingen(R) Mitte
-19:55
-</td>
-<td class="platform">
-<strong>11</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:36</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/109038/179904/414878/171093/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:36&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/ice_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/109038/179904/414878/171093/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:36&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-ICE 605
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000026','00:58'); return false;" href="/bin/bhftafel.exe/dn?input=Basel Bad Bf%238000026&amp;boardType=dep&amp;time=00:58&amp;productsFilter=11111&amp;start=yes">
-Basel Bad Bf
-</a>
-</span>
-<br />
-Essen Hbf
-19:36
--
-Duisburg Hbf
-19:47
--
-D&#252;sseldorf Flughafen
-19:57
--
-D&#252;sseldorf Hbf
-20:12
--
-K&#246;ln Messe/Deutz Gl.11-12
-20:36
--
-Siegburg/Bonn
-20:58
--
-Montabaur
-21:19
--
-Limburg S&#252;d
-21:29
--
-Frankfurt(M) Flughafen Fernbf
-21:51
--
-Mannheim Hbf
-22:24
--
-Karlsruhe Hbf
-23:00
--
-Baden-Baden
-23:28
--
-Offenburg
-23:48
--
-Freiburg(Breisgau) Hbf
-00:20
--
-Basel Bad Bf
-00:58
-</td>
-<td class="platform">
-<strong>1</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:36</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/453681/308651/321274/9410/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:36&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/ec_ic_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/453681/308651/321274/9410/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:36&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-IC 118
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000263','20:29'); return false;" href="/bin/bhftafel.exe/dn?input=M&#252;nster(Westf)Hbf%238000263&amp;boardType=dep&amp;time=20:29&amp;productsFilter=11111&amp;start=yes">
-M&#252;nster(Westf)Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:36
--
-Gelsenkirchen Hbf
-19:44
--
-Wanne-Eickel Hbf
-19:50
--
-Recklinghausen Hbf
-19:58
--
-M&#252;nster(Westf)Hbf
-20:29
-</td>
-<td class="platform">
-<strong>6</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#f00;">ca. +15</span></span>,<br/><span class="red">Grund: Stellwerksst&#246;rung /-ausfall</span></td>
-</tr>
-<tr>
-<td class="time">19:41</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/612687/314938/939896/265731/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:41&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/612687/314938/939896/265731/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:41&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 9
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000145','20:27'); return false;" href="/bin/bhftafel.exe/dn?input=Haltern am See%238000145&amp;boardType=dep&amp;time=20:27&amp;productsFilter=11111&amp;start=yes">
-Haltern am See
-</a>
-</span>
-<br />
-Essen Hbf
-19:41
--
-Essen West
-19:43
--
-Essen-Borbeck S&#252;d
-19:46
--
-Essen-Borbeck
-19:48
--
-Essen-Gerschede
-19:50
--
-Essen-Dellwig Ost
-19:53
--
-Bottrop Hbf
-19:57
--
-Bottrop-Boy
-20:01
--
-Gladbeck West
-20:05
--
-Gelsenkirchen-Buer Nord
-20:10
--
-Gelsenkirchen-Hassel
-20:13
--
-Marl Mitte
-20:17
--
-Marl-Hamm
-20:20
--
-Haltern am See
-20:27
-</td>
-<td class="platform">
-<strong>7</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:41</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/194409/207931/152134/11264/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:41&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/ice_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/194409/207931/152134/11264/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:41&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-ICE 846
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000207','20:33'); return false;" href="/bin/bhftafel.exe/dn?input=K&#246;ln Hbf%238000207&amp;boardType=dep&amp;time=20:33&amp;productsFilter=11111&amp;start=yes">
-K&#246;ln Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:41
--
-Duisburg Hbf
-19:52
--
-D&#252;sseldorf Hbf
-20:06
--
-K&#246;ln Hbf
-20:33
-</td>
-<td class="platform">
-<strong>2</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:44</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/441111/253759/648808/177367/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:44&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/441111/253759/648808/177367/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:44&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10231
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000263','20:50'); return false;" href="/bin/bhftafel.exe/dn?input=M&#252;nster(Westf)Hbf%238000263&amp;boardType=dep&amp;time=20:50&amp;productsFilter=11111&amp;start=yes">
-M&#252;nster(Westf)Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:44
--
-Gelsenkirchen Hbf
-19:52
--
-Wanne-Eickel Hbf
-19:57
--
-Recklinghausen Hbf
-20:03
--
-Marl-Sinsen
-20:09
--
-Haltern am See
-20:15
--
-Sythen
-20:19
--
-D&#252;lmen
-20:24
--
-Buldern
-20:29
--
-Nottuln-Appelh&#252;lsen
-20:33
--
-B&#246;sensell
-20:37
--
-M&#252;nster-Albachten
-20:41
--
-M&#252;nster(Westf)Hbf
-20:50
-</td>
-<td class="platform">
-<strong>4</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:46</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/692907/1002715/585568/61815/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:46&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/692907/1002715/585568/61815/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:46&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10028
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000253','20:41'); return false;" href="/bin/bhftafel.exe/dn?input=M&#246;nchengladbach Hbf%238000253&amp;boardType=dep&amp;time=20:41&amp;productsFilter=11111&amp;start=yes">
-M&#246;nchengladbach Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:46
--
-M&#252;lheim(Ruhr)Hbf
-19:51
--
-Duisburg Hbf
-19:58
--
-Rheinhausen
-20:05
--
-Krefeld-Uerdingen
-20:10
--
-Krefeld Hbf
-20:16
--
-Viersen
-20:27
--
-M&#246;nchengladbach Hbf
-20:41
-</td>
-<td class="platform">
-<strong>1</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:48</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/88806/137766/507708/224254/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:48&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/88806/137766/507708/224254/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:48&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 6
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8003372','21:28'); return false;" href="/bin/bhftafel.exe/dn?input=K&#246;ln-Nippes%238003372&amp;boardType=dep&amp;time=21:28&amp;productsFilter=11111&amp;start=yes">
-K&#246;ln-Nippes
-</a>
-</span>
-<br />
-Essen Hbf
-19:48
--
-Essen S&#252;d
-19:50
--
-Essen Stadtwald
-19:53
--
-Essen-H&#252;gel
-19:56
--
-Essen-Werden
-19:59
--
-Kettwig
-20:03
--
-Kettwig Stausee
-20:05
--
-H&#246;sel
-20:09
--
-Ratingen Ost
-20:14
--
-D&#252;sseldorf-Rath
-20:18
--
-D&#252;sseldorf-Rath Mitte
-20:21
--
-D&#252;sseldorf-Derendorf
-20:24
--
-D&#252;sseldorf-Zoo
-20:26
--
-D&#252;sseldorf Wehrhahn
-20:28
--
-D&#252;sseldorf Hbf
-20:30
--
-D&#252;sseldorf Volksgarten
-20:34
--
-D&#252;sseldorf-Oberbilk
-20:36
--
-D&#252;sseldorf-Eller S&#252;d
-20:39
--
-D&#252;sseldorf-Reisholz
-20:41
--
-D&#252;sseldorf-Benrath
-20:44
--
-D&#252;sseldorf-Garath
-20:47
--
-D&#252;sseldorf-Hellerhof
-20:49
--
-Langenfeld(Rhld)-Berghausen
-20:52
--
-Langenfeld(Rhld)
-20:54
--
-Leverkusen-Rheindorf
-20:58
--
-Leverkusen-K&#252;ppersteg
-21:01
--
-Leverkusen Mitte
-21:03
--
-Bayerwerk
-21:06
--
-K&#246;ln-Stammheim
-21:09
--
-K&#246;ln-M&#252;lheim
-21:13
--
-K&#246;ln-Buchforst
-21:16
--
-K&#246;ln Messe/Deutz Gl. 9-10
-21:20
--
-K&#246;ln Hbf
-21:23
--
-K&#246;ln Hansaring
-21:25
--
-K&#246;ln-Nippes
-21:28
-</td>
-<td class="platform">
-<strong>12</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:50</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/111363/180613/497286/211522/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:50&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/ice_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/111363/180613/497286/211522/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:50&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-ICE 1746
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000085','20:16'); return false;" href="/bin/bhftafel.exe/dn?input=D&#252;sseldorf Hbf%238000085&amp;boardType=dep&amp;time=20:16&amp;productsFilter=11111&amp;start=yes">
-D&#252;sseldorf Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:50
--
-Duisburg Hbf
-20:02
--
-D&#252;sseldorf Hbf
-20:16
-</td>
-<td class="platform">
-<strong>2</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:51</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/910140/414152/334288/136236/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:51&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/910140/414152/334288/136236/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:51&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 9
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000266','20:37'); return false;" href="/bin/bhftafel.exe/dn?input=Wuppertal Hbf%238000266&amp;boardType=dep&amp;time=20:37&amp;productsFilter=11111&amp;start=yes">
-Wuppertal Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:51
--
-Essen-Steele
-19:55
--
-Essen-&#220;berruhr
-19:58
--
-Essen-Holthausen
-20:00
--
-Essen-Kupferdreh
-20:03
--
-Velbert-Nierenhof
-20:08
--
-Velbert-Langenberg
-20:12
--
-Velbert-Neviges
-20:16
--
-Velbert Rosenh&#252;gel
-20:20
--
-W&#252;lfrath-Aprath
-20:23
--
-Wuppertal-Vohwinkel
-20:28
--
-Wuppertal-Sonnborn
-20:31
--
-Wuppertal-Zoologischer Garten
-20:32
--
-Wuppertal-Steinbeck
-20:35
--
-Wuppertal Hbf
-20:37
-</td>
-<td class="platform">
-<strong>11</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:53</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/270825/199240/792524/305987/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:53&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/270825/199240/792524/305987/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:53&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10135
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000149','20:36'); return false;" href="/bin/bhftafel.exe/dn?input=Hamm(Westf)%238000149&amp;boardType=dep&amp;time=20:36&amp;productsFilter=11111&amp;start=yes">
-Hamm(Westf)
-</a>
-</span>
-<br />
-Essen Hbf
-19:53
--
-Wattenscheid
-19:58
--
-Bochum Hbf
-20:03
--
-Dortmund Hbf
-20:15
--
-Kamen
-20:25
--
-Hamm(Westf)
-20:36
-</td>
-<td class="platform">
-<strong>6</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:56</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/291048/204237/500602/153286/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:56&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/291048/204237/500602/153286/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:56&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 3
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000286','20:13'); return false;" href="/bin/bhftafel.exe/dn?input=Oberhausen Hbf%238000286&amp;boardType=dep&amp;time=20:13&amp;productsFilter=11111&amp;start=yes">
-Oberhausen Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:56
--
-Essen West
-19:58
--
-Essen-Frohnhausen
-20:00
--
-M&#252;lheim(Ruhr)Hbf
-20:04
--
-M&#252;lheim(Ruhr)West
-20:07
--
-M&#252;lheim(Ruhr)Styrum
-20:09
--
-Oberhausen Hbf
-20:13
-</td>
-<td class="platform">
-<strong>7</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:56</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/435786/255626/81684/104420/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:56&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/435786/255626/81684/104420/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:56&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 1
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000080','20:36'); return false;" href="/bin/bhftafel.exe/dn?input=Dortmund Hbf%238000080&amp;boardType=dep&amp;time=20:36&amp;productsFilter=11111&amp;start=yes">
-Dortmund Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-19:56
--
-Essen-Steele
-19:59
--
-Essen-Steele Ost
-20:01
--
-Essen-Eiberg
-20:04
--
-Wattenscheid-H&#246;ntrop
-20:07
--
-Bochum-Ehrenfeld
-20:11
--
-Bochum Hbf
-20:13
--
-Bochum-Langendreer West
-20:18
--
-Bochum-Langendreer
-20:20
--
-Dortmund-Kley
-20:23
--
-Dortmund-Oespel
-20:25
--
-Dortmund Universit&#228;t
-20:28
--
-Dortmund-Dorstfeld S&#252;d
-20:30
--
-Dortmund-Dorstfeld
-20:32
--
-Dortmund Hbf
-20:36
-</td>
-<td class="platform">
-<strong>11</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">19:59</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/372702/279706/611116/181324/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:59&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/ec_ic_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/372702/279706/611116/181324/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=19:59&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-EC 6
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8002553','23:30'); return false;" href="/bin/bhftafel.exe/dn?input=Hamburg-Altona%238002553&amp;boardType=dep&amp;time=23:30&amp;productsFilter=11111&amp;start=yes">
-Hamburg-Altona
-</a>
-</span>
-<br />
-Essen Hbf
-19:59
--
-Bochum Hbf
-20:08
--
-Dortmund Hbf
-20:21
--
-M&#252;nster(Westf)Hbf
-20:54
--
-Osnabr&#252;ck Hbf
-21:21
--
-Diepholz
-21:46
--
-Bremen Hbf
-22:18
--
-Hamburg-Harburg
-23:03
--
-Hamburg Hbf
-23:15
--
-Hamburg Dammtor
-23:21
--
-Hamburg-Altona
-23:30
-</td>
-<td class="platform">
-<strong>4</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#f00;">ca. +15</span></span>,<br/><span class="red">Grund: Stellwerksst&#246;rung /-ausfall</span></td>
-</tr>
-<tr>
-<td class="time">20:00</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/526677/318952/652836/150859/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:00&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/ec_ic_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/526677/318952/652836/150859/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:00&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-IC 2315
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000105','23:11'); return false;" href="/bin/bhftafel.exe/dn?input=Frankfurt(Main)Hbf%238000105&amp;boardType=dep&amp;time=23:11&amp;productsFilter=11111&amp;start=yes">
-Frankfurt(Main)Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-20:00
--
-Duisburg Hbf
-20:10
--
-D&#252;sseldorf Hbf
-20:25
--
-K&#246;ln Hbf
-20:50
--
-Bonn Hbf
-21:12
--
-Koblenz Hbf
-21:46
--
-Mainz Hbf
-22:38
--
-Frankfurt(M) Flughafen Fernbf
-22:59
--
-Frankfurt(Main)Hbf
-23:11
-</td>
-<td class="platform">
-<strong>2</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">20:05</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/155067/160070/775204/335913/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:05&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/155067/160070/775204/335913/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:05&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 1
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000087','21:17'); return false;" href="/bin/bhftafel.exe/dn?input=Solingen Hbf%238000087&amp;boardType=dep&amp;time=21:17&amp;productsFilter=11111&amp;start=yes">
-Solingen Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-20:05
--
-Essen West
-20:07
--
-Essen-Frohnhausen
-20:10
--
-M&#252;lheim(Ruhr)Hbf
-20:15
--
-M&#252;lheim(Ruhr)Styrum
-20:18
--
-Duisburg Hbf
-20:23
--
-Duisburg-Schlenk
-20:27
--
-Duisburg-Buchholz
-20:30
--
-Duisburg-Gro&#223;enbaum
-20:32
--
-Duisburg-Rahm
-20:35
--
-Angermund
-20:37
--
-D&#252;sseldorf Flughafen
-20:41
--
-D&#252;sseldorf-Unterrath
-20:44
--
-D&#252;sseldorf-Derendorf
-20:47
--
-D&#252;sseldorf-Zoo
-20:49
--
-D&#252;sseldorf Wehrhahn
-20:51
--
-D&#252;sseldorf Hbf
-20:53
--
-D&#252;sseldorf Volksgarten
-20:56
--
-D&#252;sseldorf-Oberbilk
-20:58
--
-D&#252;sseldorf-Eller Mitte
-21:01
--
-D&#252;sseldorf-Eller
-21:03
--
-Hilden
-21:08
--
-Hilden S&#252;d
-21:10
--
-Solingen Vogelpark
-21:14
--
-Solingen Hbf
-21:17
-</td>
-<td class="platform">
-<strong>7</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">20:06</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/939699/421653/539178/43644/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:06&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/939699/421653/539178/43644/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:06&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 3
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8002640','20:25'); return false;" href="/bin/bhftafel.exe/dn?input=Hattingen(R) Mitte%238002640&amp;boardType=dep&amp;time=20:25&amp;productsFilter=11111&amp;start=yes">
-Hattingen(R) Mitte
-</a>
-</span>
-<br />
-Essen Hbf
-20:06
--
-Essen-Steele
-20:09
--
-Essen-Steele Ost
-20:12
--
-Essen-Horst
-20:14
--
-Bochum-Dahlhausen
-20:17
--
-Hattingen(Ruhr)
-20:22
--
-Hattingen(R) Mitte
-20:25
-</td>
-<td class="platform">
-<strong>11</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">20:07</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/279441/231405/931188/372461/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:07&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/279441/231405/931188/372461/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:07&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-ABR 5681
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000142','20:46'); return false;" href="/bin/bhftafel.exe/dn?input=Hagen Hbf%238000142&amp;boardType=dep&amp;time=20:46&amp;productsFilter=11111&amp;start=yes">
-Hagen Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-20:07
--
-Essen-Kray S&#252;d
-20:10
--
-Wattenscheid
-20:14
--
-Bochum Hbf
-20:20
--
-Witten Hbf
-20:32
--
-Wetter(Ruhr)
-20:37
--
-Hagen-Vorhalle
-20:41
--
-Hagen Hbf
-20:46
-</td>
-<td class="platform">
-<strong>10</strong><br />
-</td>
-<td class="ris">
-<span><span title="Es liegen keine aktuellen Informationen vor.">k.A.</span></span></td>
-</tr>
-<tr>
-<td class="time">20:09</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/287949/204662/623744/215890/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:09&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/287949/204662/623744/215890/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:09&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10138
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000001','22:07'); return false;" href="/bin/bhftafel.exe/dn?input=Aachen Hbf%238000001&amp;boardType=dep&amp;time=22:07&amp;productsFilter=11111&amp;start=yes">
-Aachen Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-20:09
--
-M&#252;lheim(Ruhr)Hbf
-20:14
--
-Duisburg Hbf
-20:20
--
-D&#252;sseldorf Flughafen
-20:31
--
-D&#252;sseldorf Hbf
-20:37
--
-D&#252;sseldorf-Benrath
-20:45
--
-Leverkusen Mitte
-20:54
--
-K&#246;ln-M&#252;lheim
-21:01
--
-K&#246;ln Messe/Deutz
-21:07
--
-K&#246;ln Hbf
-21:12
--
-K&#246;ln-Ehrenfeld
-21:19
--
-Horrem
-21:27
--
-D&#252;ren
-21:38
--
-Langerwehe
-21:45
--
-Eschweiler Hbf
-21:52
--
-Stolberg(Rheinl)Hbf
-21:56
--
-Aachen-Rothe Erde
-22:02
--
-Aachen Hbf
-22:07
-</td>
-<td class="platform">
-<strong>2</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">20:11</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/340353/224231/18196/104353/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:11&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/340353/224231/18196/104353/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:11&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 9
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000047','20:28'); return false;" href="/bin/bhftafel.exe/dn?input=Bottrop Hbf%238000047&amp;boardType=dep&amp;time=20:28&amp;productsFilter=11111&amp;start=yes">
-Bottrop Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-20:11
--
-Essen West
-20:13
--
-Essen-Borbeck S&#252;d
-20:16
--
-Essen-Borbeck
-20:18
--
-Essen-Gerschede
-20:21
--
-Essen-Dellwig Ost
-20:24
--
-Bottrop Hbf
-20:28
-</td>
-<td class="platform">
-<strong>7</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">20:14</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/158772/824721/523722/208940/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:14&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/158772/824721/523722/208940/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:14&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RE 10029
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000149','21:10'); return false;" href="/bin/bhftafel.exe/dn?input=Hamm(Westf)%238000149&amp;boardType=dep&amp;time=21:10&amp;productsFilter=11111&amp;start=yes">
-Hamm(Westf)
-</a>
-</span>
-<br />
-Essen Hbf
-20:14
--
-Wattenscheid
-20:19
--
-Bochum Hbf
-20:24
--
-Dortmund Hbf
-20:37
--
-Dortmund-Scharnhorst
-20:50
--
-Dortmund-Kurl
-20:53
--
-Kamen-Methler
-20:56
--
-Kamen
-20:59
--
-Hamm(Westf)
-21:10
-</td>
-<td class="platform">
-<strong>6</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">20:17</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/996606/474621/929754/132675/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:17&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/ice_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/996606/474621/929754/132675/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:17&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-ICE 947
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8098160','00:46'); return false;" href="/bin/bhftafel.exe/dn?input=Berlin Hbf (tief)%238098160&amp;boardType=dep&amp;time=00:46&amp;productsFilter=11111&amp;start=yes">
-Berlin Hbf (tief)
-</a>
-</span>
-<br />
-Essen Hbf
-20:17
--
-Bochum Hbf
-20:28
--
-Dortmund Hbf
-20:41
--
-Hamm(Westf)
-20:59
--
-Bielefeld Hbf
-21:27
--
-Hannover Hbf
-22:28
--
-Wolfsburg Hbf
-23:21
--
-Stendal
-00:02
--
-Berlin-Spandau
-00:36
--
-Berlin Hbf (tief)
-00:46
-</td>
-<td class="platform">
-<strong>4</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">20:18</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/197847/173512/85568/23165/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:18&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/197847/173512/85568/23165/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:18&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-RB 11245
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8000263','21:22'); return false;" href="/bin/bhftafel.exe/dn?input=M&#252;nster(Westf)Hbf%238000263&amp;boardType=dep&amp;time=21:22&amp;productsFilter=11111&amp;start=yes">
-M&#252;nster(Westf)Hbf
-</a>
-</span>
-<br />
-Essen Hbf
-20:18
--
-Gelsenkirchen Hbf
-20:25
--
-Wanne-Eickel Hbf
-20:30
--
-Recklinghausen S&#252;d
-20:34
--
-Recklinghausen Hbf
-20:38
--
-Marl-Sinsen
-20:43
--
-Haltern am See
-20:49
--
-Sythen
-20:53
--
-D&#252;lmen
-20:58
--
-Buldern
-21:03
--
-Nottuln-Appelh&#252;lsen
-21:07
--
-B&#246;sensell
-21:11
--
-M&#252;nster-Albachten
-21:14
--
-M&#252;nster(Westf)Hbf
-21:22
-</td>
-<td class="platform">
-<strong>9</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr>
-<td class="time">20:18</td>
-<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/150147/158211/543588/221745/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:18&amp;station_evaId=8000098&amp;station_type=dep&amp;"><img src="/v/820/img/sbahn_24x24.gif" class="middle" alt="" /></a></td><td class="train">
-<a href="/bin/traininfo.exe/dn/150147/158211/543588/221745/80?ld=96248&amp;country=DEU&amp;rt=1&amp;date=06.07.11&amp;time=20:18&amp;station_evaId=8000098&amp;station_type=dep&amp;">
-S 6
-</a>
-</td>
-<td class="route">
-<span class="bold">
-<a onclick="sHC(this, '', '8003372','21:58'); return false;" href="/bin/bhftafel.exe/dn?input=K&#246;ln-Nippes%238003372&amp;boardType=dep&amp;time=21:58&amp;productsFilter=11111&amp;start=yes">
-K&#246;ln-Nippes
-</a>
-</span>
-<br />
-Essen Hbf
-20:18
--
-Essen S&#252;d
-20:20
--
-Essen Stadtwald
-20:23
--
-Essen-H&#252;gel
-20:26
--
-Essen-Werden
-20:29
--
-Kettwig
-20:33
--
-Kettwig Stausee
-20:35
--
-H&#246;sel
-20:39
--
-Ratingen Ost
-20:44
--
-D&#252;sseldorf-Rath
-20:48
--
-D&#252;sseldorf-Rath Mitte
-20:51
--
-D&#252;sseldorf-Derendorf
-20:54
--
-D&#252;sseldorf-Zoo
-20:56
--
-D&#252;sseldorf Wehrhahn
-20:58
--
-D&#252;sseldorf Hbf
-21:00
--
-D&#252;sseldorf Volksgarten
-21:04
--
-D&#252;sseldorf-Oberbilk
-21:06
--
-D&#252;sseldorf-Eller S&#252;d
-21:09
--
-D&#252;sseldorf-Reisholz
-21:11
--
-D&#252;sseldorf-Benrath
-21:14
--
-D&#252;sseldorf-Garath
-21:17
--
-D&#252;sseldorf-Hellerhof
-21:19
--
-Langenfeld(Rhld)-Berghausen
-21:22
--
-Langenfeld(Rhld)
-21:24
--
-Leverkusen-Rheindorf
-21:28
--
-Leverkusen-K&#252;ppersteg
-21:31
--
-Leverkusen Mitte
-21:33
--
-Bayerwerk
-21:36
--
-K&#246;ln-Stammheim
-21:39
--
-K&#246;ln-M&#252;lheim
-21:43
--
-K&#246;ln-Buchforst
-21:46
--
-K&#246;ln Messe/Deutz Gl. 9-10
-21:50
--
-K&#246;ln Hbf
-21:53
--
-K&#246;ln Hansaring
-21:55
--
-K&#246;ln-Nippes
-21:58
-</td>
-<td class="platform">
-<strong>12</strong><br />
-</td>
-<td class="ris">
-<span><span style="color:#50aa50;">p&#252;nktlich</span></span></td>
-</tr>
-<tr class="browse">
-<td class="time">
-<a href="http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;country=DEU&amp;rt=1&amp;input=Essen Hbf%238000098&amp;boardType=dep&amp;time=19:19%2B60&amp;productsFilter=11111&amp;&amp;&amp;date=06.07.11&amp;&amp;selectDate=&amp;maxJourneys=&amp;start=yes" class="arrowlink arrowlinkbottom">sp&#228;ter</a>
-</td>
-<td colspan="2" class="train">&nbsp;</td>
-<td class="route">
-</td>
-<td class="platform">&nbsp;</td>
-<td class="ris">&nbsp;</td>
-</tr>
-</table>
-<p class="lastParagraph">
-Anzeige aller Halte bis zu diesem Zeichen <img src="/v/820/img/sq_sep.gif" />, dahinter Anzeige der wichtigsten Halte.
-</p>
-<a name="end"></a>
-</div>
-<div id="hafasContentEnd">&nbsp;</div>
-</div>
-<div id="hafasLegend" >
-<div class="content">
-<div class="woIcon clearfix">Alle <a href="http://www.bahn.de/app_hilfe_angabengewaehr_pk_de_DEU.shtml" onclick="popUp('about:blank','angaben','cms');" target="angaben" >Angaben</a> ohne Gew&#228;hr.</div>
-</div>
-<div class="end">
-</div>
-</div>
-<div id="hafasSystembar" class="box site-actions">
-<ul class="clearfix">
-<li><a href="javascript:window.print(self)" id="link-print">Seite drucken</a></li>
-<li><a href="#" id="link-top">Zum Seitenanfang</a></li>
-</ul>
-</div>
-</div>
-<div id="footer">
-<!-- Footer navigation -->
-<ul id="footer-nav">
-<li><span>&copy;&nbsp;Deutsche&nbsp;Bahn&nbsp;AG</span></li>
-<li><a href="http://www.bahn.de/app_agb_pk_de_DEU.shtml" target="_blank">AGB</a></li>
-<li><a href="http://www.bahn.de/app_impressum_pk_de_DEU.shtml" target="_blank">Impressum</a></li>
-<li><a href="http://www.bahn.de/app_datenschutz_pk_de_DEU.shtml" target="_blank">Datenschutzgrunds&#228;tze</a></li>
-<li><a href="http://www.deutschebahn.com" target="_blank">www.deutschebahn.com</a></li>
-</ul>
-<form method="get" action="/">
-<fieldset>
-<input type="hidden" name="bufferUpdater" id="bufferUpdater" disabled="disabled" value="" />
-</fieldset>
-</form>
-<div class="bar"></div>
-<!-- Softwareversion/Datenstand: HAFAS 5.29.DB.R8.20.k [5.29.DB.R8.20.m/8.20.14(11)_data:f35bcbe2] 96248 -->
-</div>
-<div class="webtrack">
-<!-- SiteCatalyst Version: H.20.3. Copyright 1996-2009 Adobe, Inc. All Rights Reserved-->
-<script language="JavaScript">var s_account="dbbahnprod";</script>
-<script language="JavaScript" type="text/javascript" src="/v/760/js/s_code.js"></script>
-<script language="JavaScript" type="text/javascript"><!--
-s.pageName="Auskunft_Abfahrtsplan";
-s.channel="Auskunft";
-s.prop4="Auskunft";
-/* Conversion Variables */
-s.eVar4="Auskunft";
-/************* DO NOT ALTER ANYTHING BELOW THIS LINE ! *************/
-var s_code=s.t();if(s_code)document.write(s_code)//--></script>
-<script language="JavaScript" type="text/javascript"><!--
-if(navigator.appVersion.indexOf('MSIE')>=0)document.write(unescape('%3C')+'\!-'+'-')
-//--></script>
-<noscript><img
-src="http://t.bahn.de/b/ss/dbbahnprod/1/H.20.3--NS/1802787822?pageName=Auskunft_Abfahrtsplan&ch=Auskunft&c4=Auskunft&v4=Auskunft"
-height="1" width="1" border="0" alt="" /></a></noscript><!--/NICHT
-ENTFERNEN/-->
-<!-- End SiteCatalyst Code Version: H.20.3. -->
-</div>
-</div>
-</body>
-</html>