Leser: 27
2010-04-06T08:48:04 esskarDazu kommt auch noch, das HTML (anders zu XML) keine reguläre Sprache ist, wodurch sie sich recht schlecht durch einen regulären Ausdruck ausdrücken lässt.
2010-04-06T09:55:07 esskarHTML ist per definition keine reguläre sprache, kann also daher nicht durch einen regulären ausdruck dargestellt werden.
2010-04-06T10:35:27 esskarich hab keine regulären ausdrücke empfohlen oder?
2010-04-06T10:35:27 esskarich wollte eigentlich nur verdeutlichen, dass es ungeschickt ist, sich auf einen regulären ausdruck zu verlassen, wenn man es nicht mit einer regulären sprache zu tun hat. leider verstehst du den zusammenhang noch nicht.
2010-04-06T10:35:27 esskarviel lesen und üben hilft da manchmal.
2010-04-06T10:35:27 esskarHTML::TableExtract nutz ich übriegens für html parserei.
2010-04-06T10:20:47 biancaEinerseits wird hier Regex empfohlen, um aus HTML Dinge rauszuziehen und andererseits kommst Du mit der Aussage, man könne mit Regex kein HTML darstellen, weil es keine reguläre Sprache ist.
Was soll ein Anfänger denn damit anfangen?
QuoteP.S.: Es ist zwar super lieb und großartig, wenn ihr mir ein kleines Programm schreibt, aber eigentlich wäre mir eine Erklärung wichtiger, denn ich hab in der zwischenzeit 4 "Bücher" zur Einführung in Perl, die mir alle erklären was ein assoziativer Array ist, wie man Bäume erstellt oder Listen sortiert aber irgendwie leider wenig zu meinem Problem HTML zu Parsen. Der Artikel von Renee geht zwar schon mehr in die Richtung an lehrreicher "Literatur" die ich suche, aber leider gibt es da wenig Erklärung und viel Code...
2010-04-06T11:23:39 pqwarum sollte esskar verpflichtet sein, eine alternative zu regex und parser-modulen zu bieten?
2010-04-06T11:33:40 bianca2010-04-06T11:23:39 pqwarum sollte esskar verpflichtet sein, eine alternative zu regex und parser-modulen zu bieten?
Weil sich das meiner Meinung nach so gehört, dass man auch auf Fragestellungen eingeht und sagt, wie man es macht, wenn man sich schon genötigt fühlt zu wiederholen, wie man es vernünftigerweise NICHT macht.
2010-04-06T11:41:40 pqnochmal:
warum sollte esskar verpflichtet sein, eine alternative zu regex und parser-modulen zu bieten?
2010-04-06T11:47:47 biancaAuf Deine Verdrehungen der Dinge gehe ich jetzt aber nicht auch noch ein.
2010-04-06T10:20:47 biancaWer empfahl hier einen RegEx zum Extrahieren von HTML-Inhalten?Einerseits wird hier Regex empfohlen, um aus HTML Dinge rauszuziehen
2010-04-06T10:39:49 GwenDragonWer empfahl hier einen RegEx zum Extrahieren von HTML-Inhalten?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use LWP::Simple; my $file=shift; my $data=''; if($file=~m!^http://!) { $data=get($file); } elsif(-f $file) { $data=eval{local($/,@ARGV)=(undef,$file); <>}; } elsif($file eq '-') { local $/=undef; $data=<STDIN>; } else { $data=$file; } print Dumper(parse($data)); ######################################################################## sub parse { # Liste mit allen Single-Tags my @single=qw( br hr ); # Abschuss-Tag erzwingen my %optional=( li=>[qw(ul ol)] td=>[qw(tr th)]); my $data=shift || ''; my $tree={name=>'root',childs=>[],opts=>{}}; my @deep=({name=>'root',ref=>$tree}); #Sind überhaupt html-tags enthalten? return undef if($data!~m!</?[\w\-_]+\s*(?:[\w\-_]+\s*=\s*(?:"[^"]*"|'[^']*'|[^<>]*)\s*)*\s*?/?>!s); # alle Tags finden und bearbeiten while($data=~m#<(/?[A-Za-z0-9][\w\-_]+)\s*((?:[\w\-_]+\s*=\s*(?:"[^"]*"|'[^']*'|[^<>]*)\s*)*)\s*?(/?)>((?:<!--.*?-->|[^<>]*)*)#gcs) { my $name=lc($1); my $opts=$2; my $single=$3; my $text=$4; my $end=0; # Single-Tag erzwingen $single=1 if(grep{lc($_) eq lc($name)}@single); $text=~s/^\s*(.*?)\s*$/$1/gs; # es handelt sich um einen Abschluss-Tag if(substr($name,0,1) eq '/') { # / entfernen substr($name,0,1,''); # Schon letzter end-tag last unless(@deep>1); # Passenden Abschluss-Tag finden while(my $p=shift(@deep)) { last if($p->{name} eq $name); } # keinen passenden gefunden last unless(@deep); # Block als Singeltag verarbeiten $single=1; $end=1; } # Abschusstag erzwingen if(exists($optional{$name}) && @deep>0) { my $cnt=1; while($cnt<@deep) { last if(grep{$deep[-$cnt]->{name} eq $_}@{$optional{$name}}); $cnt++; } $end=-$cnt; } # es ist kein Abschluss-Tag if($end<1) { # neuen Eintrag Erzeugen my $ref={name=>$name,childs=>[],opts=>{}}; push(@{$deep[$end]->{ref}->{childs}},$ref); # wir haben keine Single-Tag unshift(@deep,{name=>$name,ref=>$ref}) if(!$single); # Optionen Parsen if($opts) { while($opts=~s!(\w+)\s*=\s*"([^"]*)"!!s) { $ref->{opts}->{$1}=$2; } while($opts=~s!(\w+)\s*=\s*'([^']*)'!!s) { $ref->{opts}->{$1}=$2; } while($opts=~s!(\w+)\s*=\s*(\S*)!!s) { $ref->{opts}->{$1}=$2; } } } push(@{$deep[0]->{ref}->{childs}}, $text) if($text); } return $tree; }
2010-04-06T13:24:21 topegworan liegt das nur? ;-)XHTML wird ohne Probleme geparst. Bei HTML fehlen viele Ausnahmeegelungen
2010-04-06T13:35:39 esskar2010-04-06T13:24:21 topegworan liegt das nur? ;-)XHTML wird ohne Probleme geparst. Bei HTML fehlen viele Ausnahmeegelungen