Schrift
[thread]6025[/thread]

ganzer bereich aus html parsen

Leser: 1


<< >> 7 Einträge, 1 Seite
ptk
 2004-01-20 13:54
#79311 #79311
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[@Moderatoren: dieser Artikel gehoert wohl ins allgemeine Perl-Forum]

Ich komme mit HTML::TreeBuilder besser klar als mit HTML::Parser, vielleicht du auch? Dort wuerde man es ungefaehr so machen: mit $tree->look_down("_tag","span", "id", ...) alle Tags suchen, die <span> mit der richtigen Id haben und dann weiternavigieren, entweder mit $span->descendents oder wieder mit look_down.
benno
 2004-01-20 13:23
#79312 #79312
User since
2004-01-20
2 Artikel
BenutzerIn
[default_avatar]
hallo,

ich möchte aus einer komplexen htmlseite einen kompletten bereich herausparsen welcher in einer speziellen "span" liegt.

am liebsten würde ich HTML::Parser verwenden, ich komme damit leider nicht weiter.

ich möchte aus:
Code: (dl )
<span id="Historybar1_lbHistBar" class="path"><a class="path" href="../../main/default.aspx?lang=EN">xyz.com</a> / <a class="path" href="../../main/automotive/default.aspx?lang=EN&cat=Automotive">Automotive</a> / <span>Products & solutions</span> / <span>Acoustic know-how</span></span>


diesen bereich rausparsen:
Code: (dl )
<a class="path" href="../../main/default.aspx?lang=EN">xyz.com</a> / <a class="path" href="../../main/automotive/default.aspx?lang=EN&cat=Automotive">Automotive</a> / <span>Products & solutions</span> / <span>Acoustic know-how</span>


könnt ihr mir bitte einen denkansatz liefern?

ps.
bin newbie in sachen perl
pq
 2004-01-20 14:22
#79313 #79313
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
verschoben: CGI -> Allgemeines
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2004-01-20 15:18
#79314 #79314
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
naja, sonst tuts auch eine normale RE der Form

Code: (dl )
1
2
3
4
5
6
7
m~<span WASDIESENSPANEINDEUTIGMACHT>
  (
   (?:(?!</span>).)+
   |
   <span[^>]*>(?:(?!</span>).)+</span>
  )+
 ~x;


mal so als Denkansartz ungetestet. Aber natürlich ist das Verwenden von für diesen Einsatz vorgesehenen und gut getesteten Modulen voruzuziehen, wenn man es hinbekommt...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
benno
 2004-01-20 23:01
#79315 #79315
User since
2004-01-20
2 Artikel
BenutzerIn
[default_avatar]
kann mir bitte jemand den re von crian erläutern, irgendwie blike ich hier nocht so ganz durch.
Crian
 2004-01-21 11:02
#79316 #79316
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ja.

Code: (dl )
1
2
3
4
5
6
7
m~<span WASDIESENSPANEINDEUTIGMACHT>
  (
   (?:(?!</span>).)+
   |
   <span[^>]*>(?:(?!</span>).)+</span>
  )+
 ~x;


Schauen wir uns den Audruck einmal an.

<span WASDIESENSPANEINDEUTIGMACHT>

Er fängt mit dem eindeutig gekennzeichneten span an, wie der eindeutig ist, musst Du ja wissen, ev. über ein id="meinspan" oder wie auch immer.

Das was nun folgt wird in einer Klammer gefangen, damit es hinterher in der Variablen $1 steht.

Was darf nun hier folgen?

1) (?:(?!</span>).)+ Zeichen, die nicht der Anfang von "</span>" sind (das Plus dient nur zur Beschleunigung, falls es das wirklich tut...)

oder

2) <span[^>]*>(?:(?!</span>).)+</span> komplette in span-Tags eingeschlossene Ausdrücke (denn diese darf man ja schachteln).

Davon darf immer wieder 1 bis unendlich viele folgen.
Der Ausdruck wird aufhören, wenn er an das </span> des ursprünglichen (besonderen) span-Tags stößt, da das erste Zeichen davon ("<") weder auf die erste noch auf die zweite erlaubte Kategorie passt.

Alles klar?

Edit: Smilies ausgeschaltet\n\n

<!--EDIT|Crian|1074675770-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-01-21 11:24
#79317 #79317
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ok, die RE war noch nicht ganz richtig... hier die getestete richtige Variante:

Code: (dl )
1
2
3
4
5
6
7
8
9
m~<span[^>]*id="Historybar1_lbHistBar"[^>]*>
  (
   (?:
    <span[^>]*>(?:(?!</span>).)+</span>
    |
    (?!</span>).
   )+
  )
 ~xs


Getestet in folgendem Code (Wobei die auseinandergezogenen Doppelunterstriche wieder zusammenzuziehen sind (ist ein Boardfehler)):

Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings;

my $data;
{
    local $/;       # Slurp-Mode
    $data = <DATA>;
}

if ( $data =~ m~<span[^>]*id="Historybar1_lbHistBar"[^>]*>
                (
                 (?:
                  <span[^>]*>(?:(?!</span>).)+</span>
                  |
                  (?!</span>).
                 )+
                )
               ~xs
   )
{
    print "Treffer:\n$1\n";
}
else {
    print "Kein Treffer.\n";
}


_ _ DATA _ _
<p>Dies ist ein Auszug aus einem <span class="xxx">m&ouml;glichen</span>
HTML-Dokument.</p>

<p>
<span id="Historybar1_lbHistBar" class="path">
<a class="path" href="../../main/default.aspx?lang=EN">xyz.com</a>
/
<a class="path" href="../../main/automotive/default.aspx?lang=EN&cat=Automotive">Automotive</a>
/
<span>Products & solutions</span>
/
<span>Acoustic know-how</span></span>
</p>

<p><span class="xxx"><span class="y">Ein</span> weiterer
dummer <span class="z">Testtext</span></span>.</p>


Mit der Ausgabe

Code: (dl )
1
2
3
4
5
6
7
8
9
Treffer:

<a class="path" href="../../main/default.aspx?lang=EN">xyz.com</a>
/
<a class="path" href="../../main/automotive/default.aspx?lang=EN&cat=Automotive">Automotive</a>
/
<span>Products & solutions</span>
/
<span>Acoustic know-how</span>



Erklärung zur RE: Schauen wir uns den Audruck einmal an.

<span[^>]*id="Historybar1_lbHistBar"[^>]*>

Er fängt mit dem eindeutig gekennzeichneten span an, so wie es in Deinem Beispiel aussah war diese id die eindeutige Kennung.

Das was nun folgt wird in einer Klammer gefangen, damit es hinterher in der Variablen $1 steht.

Was darf nun hier folgen? Ein bis beliebig viele Dinge, die folgendermaßen beschaffen sein dürfen:

1) <span[^>]*>(?:(?!</span>).)+</span> komplette in span-Tags eingeschlossene Ausdrücke (denn diese darf man ja schachteln).

oder

2) (?!</span>). Zeichen, die nicht der Anfang von "</span>" sind

Der Ausdruck wird aufhören, wenn er an das </span> des ursprünglichen (besonderen) span-Tags stößt, da das erste Zeichen davon ("<") weder auf die erste noch auf die zweite erlaubte Kategorie passt.

Edit: Mal wieder Smilies ausgeschaltet :-[

Edit2: Grenzen: Kommen in Deinem span wiederum ineinander verschachtelte spans vor, wird ein falsches Ergebnis zurückgeliefert. Deshalb ist es - wie so oft - besser, einen echten Parser zu verwenden, der mit solchen Sachen klarkommt.
Man könnte jetzt die RE noch auf eine Schachtelstufe weiter aufwulsten, aber das löst das Problem nicht. Deshalb kann soetwas immer nur eine Notlösung sein.\n\n

<!--EDIT|Crian|1074677558-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 7 Einträge, 1 Seite



View all threads created 2004-01-20 13:54.