# Parsen von Daten aus einer Homepage



## _Fussel_ (8. Nov 2012)

Hallo erstmal ich bin neu hier und hab schon die erste Frage.

Ich will Daten aus einer HTML-Page parsen, die Page sieht so aus.


```
<body  onload="removeDefaultValues(false);" style="">
<div id="doc" style="height:100%;">
<div id="header" >
<div id="logo">
<img src="http://reiseauskunft.bahn.de/v/940/img/logo-db-bahn.gif" width="126" height="32" alt="DB Bahn" />
</div>
<div id="header-elements" class="clearfix">
<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=Saarbr%FCcken+hbf&amp;date=Do%2C+08.11.12&amp;time=10%3A24&amp;boardType=dep&amp;REQTrain_name=&amp;advancedProductMode=&amp;GUIREQProduct_0=on&amp;GUIREQProduct_1=on&amp;GUIREQProduct_2=on&amp;GUIREQProduct_3=on&amp;GUIREQProduct_4=on&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=Saarbr%FCcken+hbf&amp;date=Do%2C+08.11.12&amp;time=10%3A24&amp;boardType=dep&amp;REQTrain_name=&amp;advancedProductMode=&amp;GUIREQProduct_0=on&amp;GUIREQProduct_1=on&amp;GUIREQProduct_2=on&amp;GUIREQProduct_3=on&amp;GUIREQProduct_4=on&amp;start=Suchen&amp;&amp;font-size=1" tabindex="50" class="font-large" title="Schrift größer">a+</a><span>,</span>
<a href="http://reiseauskunft.bahn.de/bin/bhftafel.exe?input=Saarbr%FCcken+hbf&amp;date=Do%2C+08.11.12&amp;time=10%3A24&amp;boardType=dep&amp;REQTrain_name=&amp;advancedProductMode=&amp;GUIREQProduct_0=on&amp;GUIREQProduct_1=on&amp;GUIREQProduct_2=on&amp;GUIREQProduct_3=on&amp;GUIREQProduct_4=on&amp;start=Suchen&amp;&amp;font-size=2" tabindex="60" class="font-xl" title="Schrift extra groß">a++</a>
</li>
</ul>
</div>
</div>
<div id="main-nav" class="clearfix">
<h2 class="mainNaviHeadingCorrection">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 style="width:215px;" 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"><a class="arrowlink" href="http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;rt=1&amp;input=Saarbrücken Hbf%238000323&amp;boardType=dep&amp;time=10:24&amp;productsFilter=11111&amp;dateBegin=09.12.12&amp;dateEnd=14.12.13&amp;start=yes&amp;rt=0">Suche im Gesamtfahrplan 09.12.12 - 14.12.13</a>Abfahrt und Ankunft</h1>
<form action="http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?ld=96248&amp;rt=1&amp;" id="sqQueryForm" 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="Saarbrücken Hbf" size="40" maxlength="60" />
<input type="hidden" name="inputRef" value="Saarbrücken Hbf#008000323" />
<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>
<img src="http://reiseauskunft.bahn.de/v/940/img/blaettern_links_16x16.png" height="16" width="16" border="0" onclick="calman.shiftDate('callink0',-1);" style="margin:0;vertical-align:middle; border: none;" class="pointer" alt="Einen Tag früher" title="Einen Tag früher" />
<input class="emphasized" style="margin-right: 0;" type="text" name="date" id="date" value="08.11.12" size="10" maxlength="14" onblur="javascript:this.notify(this);"/>
<img src="http://reiseauskunft.bahn.de/v/940/img/blaettern_rechts_16x16.png" height="16" width="16" border="0" onclick="calman.shiftDate('callink0',1);" style="margin:0;vertical-align:middle; border: none;" class="pointer" alt="Einen Tag später" title="Einen Tag später" />
<span class="jsShowInline" style="position: relative;">
<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="http://reiseauskunft.bahn.de/v/940/img/kalender_21x16.gif" width="21" height="16" title="Kalender" alt="Kalender" id="calendarlinkicon0"/></a>
<script type="text/javascript">
calman.config = {
"today"           : parseUserDateInput("08.11.12"),
"viewPeriodS"     : parseUserDateInput("11.12.11"),
"viewPeriodE"     : parseUserDateInput("14.12.13"),
"dataPeriodS"     : parseUserDateInput("11.12.11"),
"dataPeriodE"     : parseUserDateInput("14.12.13"),
"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>
<img src="http://reiseauskunft.bahn.de/v/940/img/blaettern_links_16x16.png" height="16" width="16" border="0" onclick="shiftTime('HFS_time',-1);" class="pointer" style="margin:0;vertical-align:middle; border: none;" alt="Zurück zur vollen Stunde" title="Zurück zur vollen Stunde" />
<input  style="margin-right: 0;" type="text" id="HFS_time" name="time" value="10:24" size="8" maxlength="20" />
<img src="http://reiseauskunft.bahn.de/v/940/img/blaettern_rechts_16x16.png" height="16" width="16" border="0" onclick="shiftTime('HFS_time',1);" class="pointer" style="margin:0;vertical-align:middle; border: none;" alt="Weiter zur vollen Stunde" title="Weiter zur vollen Stunde" />
<span id="changeTime" class="nowrap jsShowInline nopadding sqTimeChange" style="position: relative;  margin-left: 5px;">
&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" />
<table class="products">
<tr class="icons" >
<td>&nbsp;</td>
<td><label for="prod_0"><img src="http://reiseauskunft.bahn.de/v/940/img/ice_24x24.gif" alt="ICE-Züge" title="ICE-Züge" width="24" height="24" /></label></td>
<td><label for="prod_1"><img src="http://reiseauskunft.bahn.de/v/940/img/ec_ic_24x24.gif" alt="Intercity- und Eurocityzüge" title="Intercity- und Eurocityzüge" width="24" height="24" /></label></td>
<td><label for="prod_2"><img src="http://reiseauskunft.bahn.de/v/940/img/ir_24x24.gif" alt="Interregio- und Schnellzüge" title="Interregio- und Schnellzüge" width="24" height="24" /></label></td>
<td><label for="prod_3"><img src="http://reiseauskunft.bahn.de/v/940/img/re_24x24.gif" alt="Nahverkehr, sonstige Züge" title="Nahverkehr, sonstige Züge" width="24" height="24" /></label></td>
<td><label for="prod_4"><img src="http://reiseauskunft.bahn.de/v/940/img/sbahn_24x24.gif" alt="S-Bahn" title="S-Bahn" width="24" height="24" /></label></td>
<td><label for="prod_5"><img src="http://reiseauskunft.bahn.de/v/940/img/bus_24x24.gif" alt="Busse" title="Busse" width="24" height="24" /></label></td>
<td><label for="prod_6"><img src="http://reiseauskunft.bahn.de/v/940/img/faehre_24x24.gif" alt="Schiffe" title="Schiffe" width="24" height="24" /></label></td>
<td><label for="prod_7"><img src="http://reiseauskunft.bahn.de/v/940/img/ubahn_24x24.gif" alt="U-Bahnen" title="U-Bahnen" width="24" height="24" /></label></td>
<td><label for="prod_8"><img src="http://reiseauskunft.bahn.de/v/940/img/tram_24x24.gif" alt="Straßenbahnen" title="Straßenbahnen" width="24" height="24" /></label></td>
</tr>
<tr class="cb">
<td>
<label class="front" for="prod_0">Verkehrsmittel</label>
</td>
<td>
<input id="prod_0" class="checkbox " type="checkbox" name="GUIREQProduct_0" title="ICE-Züge" checked="checked" />
</td>
<td>
<input id="prod_1" class="checkbox " type="checkbox" name="GUIREQProduct_1" title="Intercity- und Eurocityzüge" checked="checked" />
</td>
<td>
<input id="prod_2" class="checkbox " type="checkbox" name="GUIREQProduct_2" title="Interregio- und Schnellzüge" checked="checked" />
</td>
<td>
<input id="prod_3" class="checkbox " type="checkbox" name="GUIREQProduct_3" title="Nahverkehr, sonstige Züge" checked="checked" />
</td>
<td>
<input id="prod_4" class="checkbox " type="checkbox" name="GUIREQProduct_4" title="S-Bahn" checked="checked" />
</td>
<td>
<input id="prod_5" class="checkbox " type="checkbox" name="GUIREQProduct_5" title="Busse"  />
</td>
<td>
<input id="prod_6" class="checkbox " type="checkbox" name="GUIREQProduct_6" title="Schiffe"  />
</td>
<td>
<input id="prod_7" class="checkbox " type="checkbox" name="GUIREQProduct_7" title="U-Bahnen"  />
</td>
<td>
<input id="prod_8" class="checkbox " type="checkbox" name="GUIREQProduct_8" title="Straßenbahnen"  />
</td>
</tr>
</table>
</fieldset>
</div>
</div>
<p class="floatRight button-inside querybutton">
<span class="button-border">
<button type="submit" class="highlight" name="start" value="Suchen" title="Suchen" />
<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;rt=1&amp;" title="Alle Eingaben löschen">Eingaben lö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;rt=1&amp;input=Saarbrücken Hbf%238000323&amp;boardType=dep&amp;time=actual&amp;productsFilter=11111&amp;start=yes">Aktualisieren</a>
<strong>Aktueller Abfahrtsplan von Saarbrücken Hbf um 10:24 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;rt=1&amp;input=Saarbrücken Hbf%238000323&amp;boardType=dep&amp;time=10:24%2D60&amp;productsFilter=11111&amp;&amp;&amp;date=08.11.12&amp;selectDate=&amp;maxJourneys=&amp;start=yes" class="arrowlink arrowlinktop">frü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 id="journeyRow_0" class="">
<td class="time">10:30</td>
<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/858426/435608/752828/90272/80?ld=96248&amp;rt=1&amp;date=08.11.12&amp;time=10:30&amp;station_evaId=8000323&amp;station_type=dep&amp;"><img src="http://reiseauskunft.bahn.de/v/940/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
<a href="/bin/traininfo.exe/dn/858426/435608/752828/90272/80?ld=96248&amp;rt=1&amp;date=08.11.12&amp;time=10:30&amp;station_evaId=8000323&amp;station_type=dep&amp;">
RB 33723
</a>
</td>
<td class="route">
<span class="bold">
<a onclick="sHC(this, '', '8000176','11:09'); return false;" href="/bin/bhftafel.exe/dn?input=Homburg(Saar)Hbf%238000176&amp;boardType=dep&amp;time=11:09&amp;productsFilter=11111&amp;start=yes">
Homburg(Saar)Hbf
</a>
</span>
<br />
Saarbrücken Hbf 
10:30
-
Saarbrücken Ost 
10:33
-
Schafbrücke 
10:35
-
Scheidt(Saar) 
10:38
-
Rentrisch 
10:40
-
St Ingbert 
10:44
-
Rohrbach(Saar) 
10:55
-
Kirkel 
11:00
-
Limbach(b Homburg,Saar) 
11:04
-
Homburg(Saar)Hbf 
11:09
</td>
<td class="platform">
<strong>5</strong><br />
</td>
<td class="ris">
</td>
</tr>
<tr id="journeyRow_1" class="">
<td class="time">10:32</td>
<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/736977/395140/201790/144764/80?ld=96248&amp;rt=1&amp;date=08.11.12&amp;time=10:32&amp;station_evaId=8000323&amp;station_type=dep&amp;"><img src="http://reiseauskunft.bahn.de/v/940/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
<a href="/bin/traininfo.exe/dn/736977/395140/201790/144764/80?ld=96248&amp;rt=1&amp;date=08.11.12&amp;time=10:32&amp;station_evaId=8000323&amp;station_type=dep&amp;">
RB 33722
</a>
</td>
<td class="route">
<span class="bold">
<a onclick="sHC(this, '', '8000134','12:00'); return false;" href="/bin/bhftafel.exe/dn?input=Trier Hbf%238000134&amp;boardType=dep&amp;time=12:00&amp;productsFilter=11111&amp;start=yes">
Trier Hbf
</a>
</span>
<br />
Saarbrücken Hbf 
10:32
-
Saarbrücken-Burbach 
10:34
-
Luisenthal(Saar) 
10:39
-
Völklingen 
10:42
-
Bous(Saar) 
10:46
-
Ensdorf(Saar) 
10:49
-
Saarlouis Hbf 
10:52
-
Dillingen(Saar) 
10:56
-
Beckingen(Saar) 
11:00
-
Fremersdorf 
11:03
-
Merzig(Saar) 
11:06
-
Merzig(Saar) Stadtmitte 
11:08
-
Besseringen 
11:12
-
Mettlach 
11:16
-
Saarhölzbach 
11:19
-
Taben 
11:24
-
Serrig 
11:29
-
Saarburg(Bz Trier) 
11:33
-
Schoden-Ockfen 
11:37
-
Wiltingen(Saar) 
11:40
-
Kanzem 
11:43
-
Konz 
11:48
-
Karthaus 
11:50
-
Trier Süd 
11:56
-
Trier Hbf 
12:00
</td>
<td class="platform">
<strong>14</strong><br />
</td>
<td class="ris">
</td>
</tr>
<tr id="journeyRow_2" class="">
<td class="time">10:35</td>
<td class="train"><a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/650703/365972/620744/93471/80?ld=96248&amp;rt=1&amp;date=08.11.12&amp;time=10:35&amp;station_evaId=8000323&amp;station_type=dep&amp;"><img src="http://reiseauskunft.bahn.de/v/940/img/re_24x24.gif" class="middle" alt="" /></a></td><td class="train">
<a href="/bin/traininfo.exe/dn/650703/365972/620744/93471/80?ld=96248&amp;rt=1&amp;date=08.11.12&amp;time=10:35&amp;station_evaId=8000323&amp;station_type=dep&amp;">
RB 33625
</a>
</td>
<td class="route">
<span class="bold">
<a onclick="sHC(this, '', '8000154','11:58'); return false;" href="/bin/bhftafel.exe/dn?input=Türkismühle%238000154&amp;boardType=dep&amp;time=11:58&amp;productsFilter=11111&amp;start=yes">
Türkismühle
</a>
</span>
<br />
Saarbrücken Hbf 
10:35
-
Jägersfreude 
10:39
-
Dudweiler 
10:41
-
Sulzbach(Saar) 
10:44
-
Sulzbach(Saar)Altenwald 
10:47
-
Friedrichsthal(Saar) 
10:49
-
Friedrichsthal(Saar) Mitte 
10:51
-
Bildstock 
10:54
-
Landsweiler-Reden 
10:57
-
Neunkirchen(Saar)Hbf 
11:02
-
Wiebelskirchen 
11:16
-
Ottweiler(Saar) 
11:20
-
Niederlinxweiler 
11:24
-
Oberlinxweiler 
11:26
-
St Wendel 
11:30
-
Baltersweiler 
11:45
-
Hofeld 
11:47
-
Namborn 
11:50
-
Walhausen(Saar) 
11:54
-
Türkismühle 
11:58
</td>
<td class="platform">
<strong>8</strong><br />
</td>
<td class="ris">
</td>
</tr>
<tr class="current">
<td class="time">10:49</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>
...
```

Nun möchte ich gerne die Links die mich zu den weiteren Informationen bringen. Welche Ansätze kann ich verfolgen um dies so umzusetzten. Sollte ich einen HTML Parser oder über RegularExpression die Links holen.

Welche HTML parser gitb es für Java?

Danke schonmal im vorraus.


----------



## Alenka87 (8. Nov 2012)

das ist ja nichts anderes als ne XML-Datei. Wie wärs mit Dom, oder JDom?


----------



## maki (8. Nov 2012)

Alenka87 hat gesagt.:


> das ist ja nichts anderes als ne XML-Datei. Wie wärs mit Dom, oder JDom?


HTML bis einschliesslich HTML 4 ist kein XML und auch nicht wohlgefomt, regex oder XML Parser helfen einem da nicht wirklich, da muss es schon ein richtiger HTMl Parser sein sobald es sich nicht um mini-HTML Seiten handelt.

Eine Forensuche nach "HTMl Parser" liefert übrigens sehr viele Ergebnisse, wie zB dieses hier: http://www.java-forum.org/allgemeine-java-themen/142697-html-parsing-errors.html


----------



## Alenka87 (8. Nov 2012)

*schäm mich* hab nie mit html gearbeitet aber auf den ersten Blick sah das für mich nach XML-Syntax aus


----------



## _Fussel_ (8. Nov 2012)

Danke für die schnelle Atnwort. An den SAX Parser hatte ich auch schon gedacht, Probleme bekam ich dann als ich mir einen ContentHandler schreiben wollte.


----------



## Noctarius (8. Nov 2012)

Es gibt aber HTML2DOM Parser, JTidy - JTidy z.B. welches auch HTML4 in einen DOM parsen kann.


----------



## _Fussel_ (8. Nov 2012)

Ich gehe davon aus das ein DOM-Parser zuviel Ressourcen benötigt, da wir die Auswertung auf einem mobilen Gerät planen. Von daher würde sich ein Parser anbieten der keinen kompletten Objektbaum aufbaut.
Bei anderer Meinung lasse ich mich gerne beraten.


----------

