# Auslesen aus html code



## cybermotte (21. November 2004)

hallo zusammen,

also habe ein problem mit dem code hier, und zwar speichert er mir die daten nicht herraus wie er es machen soll. nach stundenlangem suchen des fehlers kann ich leider nix entdecken, aber vielleicht gibt es jemanden, dem auffällt was ich falsch mache   

hier mal mein code:


```
#!/usr/bin/perl -w

#03.05.2004, Version 1.6

use LWP::Simple;
if (@ARGV != 4) {
	$0 =~ s#^.*[\\/]##;
	&quit_program("Gebrauch: $0 [VON OZEAN] [BIS OZEAN] [GUELTIGE SID] [ZIELDATEI]\nBeispiel: $0 1 114 sid=6=n35H6dkfeqxYzMxEeI ozeane.csv\n");
}
$db_file = $ARGV[3];
open(OUTPUT, "> ".$db_file) or &quit_program("Fehler beim Öffnen der Datei $db_file\n$!\n");
$island_number = $ARGV[0]*100-99;
foreach $ocean_number ($ARGV[0]..$ARGV[1]) {
	print "Bearbeite Ozean $ocean_number...\n";
	$url = "http://www.insel-monarchie.de/$ARGV[2]/game/karte.php?ozean=$ocean_number";
	if (!($bigline=get($url))) {
		&quit_program("ABBRUCH! $url nicht erreichbar\n");
	}
	$bigline =~ s/\s+/ /g;
	$bigline =~ s/\\/\\\\/g;
	$bigline =~ s/Allianz: Punkte:/Allianz:  Punkte:/g;
	$bigline =~ s/Insel: Herrscher:/Insel:  Herrscher:/g;
	while ($bigline =~ m#<p title="Insel: (.*?) Herrscher: (.+?) Allianz: (.*?) Punkte: (-?\d+)"><a href="\./karte_user_info.php\?user=\d+"><img src=".+?" border="0"></a><br>(\d+)<br>#g) {
		if ($island_number != $5) {
			&quit_program("ABBRUCH! Fehler beim Parsen von Insel $island_number\n");
		}
		print OUTPUT "$island_number;$ocean_number;\"$1\";\"$2\";\"$3\";\"$4\"\n";
		
		# if ($3 eq "") { print "  Insel $island_number ist Allylos!\n"; }
		
		$island_number++;
	}
	$ocean_number++;
}
&quit_program("ich habe fertig\n");

sub quit_program {
	close(OUTPUT);
	if (@_ > 0) {
		print $_[0];
	}
	print "\nEingabetaste zum Beenden!";	# Diese Zeile entfernen, wenn GUI nicht benutzt wird
	<STDIN>;				# Diese Zeile entfernen, wenn GUI nicht benutzt wird
	die "\n";
}
```

und hier der html code aus dem ich das haben möchte:


```
<p title="Insel: [SK] ~ Island 76Herrscher: starplanetAllianz: [S.O.D.]~[SAM]SikokuPunkte: 904"><a href="./karte_user_info.php?user=6073"><img src="../images/islands/9.gif" border="0"></a><br><span class="karte">4941<br>[SK] ~ Island
76<br><a href="./karte_user_info.php?user=6073" class="karte"></span><span class=karte>starplanet</span></a></td><td width=70 height=70 valign=middle align=center>
```

wäre echt super wenn jemand helfen könnte, danke für eure mühe im vorraus


----------



## renee (22. November 2004)

Meine Tipps:

1. Benutze 
	
	
	



```
use strict; # jetzt musst Du alle Variablen mit 'my' deklarieren
use warnings;
```
ohne diese solltest Du nie ein Programm schreiben!

2. Sage uns doch bitte, WAS Du aus der HTML-Datei auslesen willst. Ich habe keine Lust, mir da irgendwas anhand Deines Codes zusammenzureimen!

3. Es gibt ein tolles Modul, das nennt sich HTML:arser. Gibt es auf http://search.cpan.org . Damit kann man HTML-Seiten sehr leicht parsen

4. Sage uns doch auch bitte Fehlermeldungen, soweit es welche gibt. Meine Glaskugel ist zur Zeit in Reparatur


----------



## cybermotte (22. November 2004)

klar sage ich dir was ich möchte und schon mal danke für deine tipps  die bringen mich auch auf weitere ideen.

also, ich möchte aus dem html code die daten der Insel: (hier den text), herrscher: , allianz, und die punkte auslesen und in einer datei speicher.

leider kommt keine fehlermeldung, es wird aber auch nichts in die datei gespeichert.

habe geprüft ob die html seite gelesen wird, bis dahin ist alles ok, allerdings zieht er nicht die sachen raus, die ich eben brauche. da ist der wurm drin 

danke für eure mühe


----------



## cybermotte (24. November 2004)

leider habe ich es immer noch nicht geschafft es zum laufen zu bringen 

also nach der vorlage oben im ersten post. habe derweil den tipp für mich selbst umgesetzt, aber das von oben brauch ich trotzdem noch, da es ein teil vom ganzen ist.

bitte schaut mal was daran falsch sein könnte, danke euch


----------



## renee (26. November 2004)

Du solltest Dich unbedingt mit HTML:arser auseinandersetzen... Die Informationen, die Du oben genannt hast bekommt man ziemlich fix mit:
	
	
	



```
#! /usr/bin/perl

use strict;
use warnings;
use HTML::Parser;

my @infos;
my $p = HTML::Parser->new();
$p->handler(start => \&start_handler,"tagname,attr");
$p->parse_file('html.txt');

sub start_handler{
  return if(shift ne 'p');
  my ($insel,$herrscher,$allianz,$punkte) = shift->{title} =~ /Island\s+(.+)Herrscher:\s+(.+)Allianz:\s+(.+)Punkte:\s+(\d+)/;
  print "insel:\t$insel\nHerrscher:\t$herrscher\nAllianz:\t$allianz\nPunkte:\t$punkte\n";
}
```


----------



## WGC (10. März 2005)

Hallo
ich hab das selbe problem wie oben beschrieben

könnte mir jemand die endlösung geben wenn das selbe problem ja schoneinaml bestand


vielen dank im voraus


----------



## renee (11. März 2005)

Wie wär's, wenn Du meinen Code mal ausprobierst


----------



## WGC (11. März 2005)

Naja wenn ich das versuche popt die konsole kurz auf und das wars
mehr passiert da nicht

ich bin nicht gue un Perl das geb ich gerne zu aber ich kenne mich schon etwas aus aber ich bekomm es einfach nicht hin

sorry

liegt vielleicht an meiner dummheit *g*


----------



## renee (12. März 2005)

Dann füge vor die sub mal noch 
<STDIN>; 
ein...


----------

