hilpers


  hilpers > comp.os.* > comp.os.linux.programmeren

 #1  
04.03.2010, 18:53
EeBie
Mensen,

Ik wil wat tekst uit een stuk HTML code halen. Alle stukken tekst die
niet tussen de zelfde tags staan wil ik apart houden in verschillende
variabelen of in een array. Ik heb ook al even naar wat modules gekeken
(o.a HTML:Parser en HTML::TreeBuilder) maar daarmee kreeg ik het ook niet
voorelkaar. De HTML is nette HTML met een zeer beperkt aantal tags en een
onbekend aantal stukken tekst.

Ik zit een beetje in deze richting te denken:

#!/usr/bin/perl
use strict;
use warnings;

my $html = '<b><i>foo</i></b><p><b>bar</b></p>';

foreach ($html =~ />*.</g) {
print "$1 \n"; #of stop $1 in een array
}

Weet iemand hoe die regex wel moet zijn?
 #2  
04.03.2010, 19:21
EeBie
On Thu, 04 Mar 2010 19:53:36 +0000, EeBie wrote:

> Weet iemand hoe die regex wel moet zijn?


/>(.*[^<].*)</g werkt vreemd genoeg ook niet. :-(
 #3  
04.03.2010, 19:39
robert
EeBie <eebieeebie>:
> Weet iemand hoe die regex wel moet zijn?


Zoiets?
my @text = $html =~ m/>([^<]+?)</g;
 #4  
04.03.2010, 19:39
Johan van Selst
Once upon a newsgroup, EeBie claimed:
> On Thu, 04 Mar 2010 19:53:36 +0000, EeBie wrote:
>> Weet iemand hoe die regex wel moet zijn?

> />(.*[^<].*)</g werkt vreemd genoeg ook niet. :-(


while ($html =~ />([^<]+)</g) { .. } dan?


Ciao,
Johan
 #5  
04.03.2010, 19:54
EeBie
On Thu, 04 Mar 2010 20:39:56 +0000, Johan van Selst wrote:

> Once upon a newsgroup, EeBie claimed:
>> On Thu, 04 Mar 2010 19:53:36 +0000, EeBie wrote:
>>> Weet iemand hoe die regex wel moet zijn?

>> />(.*[^<].*)</g werkt vreemd genoeg ook niet. :-(

>
> while ($html =~ />([^<]+)</g) { .. } dan?


Nee dan krijg:

bar
bar
 #6  
04.03.2010, 19:58
EeBie
On Thu, 04 Mar 2010 20:39:38 +0000, robert wrote:

> EeBie <eebieeebie>:
>> Weet iemand hoe die regex wel moet zijn?

>
> Zoiets?
> my @text = $html =~ m/>([^<]+?)</g;


Ja als ik die array met linebreaks uitprint krijg ik:

foo
bar

Dus dat lijkt goed!
Bedankt!
 #7  
04.03.2010, 20:25
Joost de Heer
On 03/04/2010 08:53 PM, EeBie wrote:
> Mensen,
>
> Ik wil wat tekst uit een stuk HTML code halen.


lynx -dump -nolist
 #8  
04.03.2010, 21:03
Mark Huizer
The wise robert enlightened me with:
> EeBie <eebieeebie>:
>> Weet iemand hoe die regex wel moet zijn?

>
> Zoiets?
> my @text = $html =~ m/>([^<]+?)</g;
>


is +? niet gelijk aan *, of mis ik dan een subtiele bijwerking?

Mark
 #9  
04.03.2010, 22:12
John Bokma
EeBie <eebieeebie> writes:

> Mensen,
>
> Ik wil wat tekst uit een stuk HTML code halen. Alle stukken tekst die
> niet tussen de zelfde tags staan wil ik apart houden in verschillende
> variabelen of in een array. Ik heb ook al even naar wat modules gekeken
> (o.a HTML:Parser en HTML::TreeBuilder) maar daarmee kreeg ik het ook niet
> voorelkaar. De HTML is nette HTML met een zeer beperkt aantal tags en een
> onbekend aantal stukken tekst.


Doe jezelf een enorm plezier en leer HTML::TreeBuilder te gebruiken voor
je jezelf in je voet schiet met regexs.

> my $html = '<b><i>foo</i></b><p><b>bar</b></p>';


--8<---------------cut here---------------start------------->8---
#!/usr/bin/perl

use strict;
use warnings;

use HTML::TreeBuilder;

my $html = '<b><i>foo</i></b><p><b>bar</b></p>';

my $tree = HTML::TreeBuilder->new_from_content( $html );

my @bold = $tree->look_down( _tag => 'b' );
print $_->as_trimmed_text(), "\n"
for @bold;
--8<---------------cut here---------------end--------------->8---
 #10  
04.03.2010, 22:14
Dr.Ruud
Mark Huizer wrote:
> The wise robert enlightened me with:
>> EeBie <eebieeebie>:


>>> Weet iemand hoe die regex wel moet zijn?

>>
>> Zoiets?
>>
>> my @text = $html =~ m/>([^<]+?)</g;

>
> is +? niet gelijk aan *, of mis ik dan een subtiele bijwerking?


Zie perldoc perlre, zoek op "greedy".

"+?" doet liever 1 dan 2.

Probeer ook eens: m/>(.+?)</g
(niet 100% equivalent)
en: m/>([^<]+)</g
 #11  
05.03.2010, 05:21
robert
Mark Huizer <xaa+news_nl.comp.os.linux.programmeren>:
> The wise robert enlightened me with:
>> EeBie <eebieeebie>:
>>> Weet iemand hoe die regex wel moet zijn?

>>
>> Zoiets?
>> my @text = $html =~ m/>([^<]+?)</g;

>
> is +? niet gelijk aan *, of mis ik dan een subtiele bijwerking?


De ? is hier niet nodig, maar '+?' is niet hetzelfde als '*' omdat die
laatste ook de lege string matcht en de eerste niet.
 #12  
05.03.2010, 05:45
Johan van Selst
Once upon a newsgroup, EeBie claimed:
> On Thu, 04 Mar 2010 20:39:56 +0000, Johan van Selst wrote:
>>> my $html = '<b><i>foo</i></b><p><b>bar</b></p>';

>> while ($html =~ />([^<]+)</g) { .. } dan?

> Nee dan krijg:
> bar
> bar


Apart. Dan heb je toch een andere perl versie dan ik...


Ciao,
Johan
 #13  
05.03.2010, 07:17
Mark Huizer
The wise robert enlightened me with:
> Mark Huizer <xaa+news_nl.comp.os.linux.programmeren>:
>> The wise robert enlightened me with:
>>> EeBie <eebieeebie>:
>>>> Weet iemand hoe die regex wel moet zijn?
>>>
>>> Zoiets?
>>> my @text = $html =~ m/>([^<]+?)</g;

>>
>> is +? niet gelijk aan *, of mis ik dan een subtiele bijwerking?

>
> De ? is hier niet nodig, maar '+?' is niet hetzelfde als '*' omdat die
> laatste ook de lege string matcht en de eerste niet.


Ah, ok, minimal matching, sorry, ik moet ook beter opletten als ik iets
zeg.

Mark
 #14  
05.03.2010, 16:21
EeBie
On Fri, 05 Mar 2010 06:45:01 +0000, Johan van Selst wrote:

> Apart. Dan heb je toch een andere perl versie dan ik...


Excuses, het werk wel. Iets fout gedaan.
 #15  
05.03.2010, 16:43
EeBie
On Thu, 04 Mar 2010 17:12:14 -0600, John Bokma wrote:

>
> Doe jezelf een enorm plezier en leer HTML::TreeBuilder te gebruiken voor
> je jezelf in je voet schiet met regexs.


Ik had er al naar gekeken maar ik kreeg mijn probleem er niet mee
opgelost. Modules hebben altijd mijn voorkeur.

> --8<---------------cut here---------------start------------->8---
> #!/usr/bin/perl
>
> use strict;
> use warnings;
>
> use HTML::TreeBuilder;
>
> my $html = '<b><i>foo</i></b><p><b>bar</b></p>';
>
> my $tree = HTML::TreeBuilder->new_from_content( $html );
>
> my @bold = $tree->look_down( _tag => 'b' ); print $_->as_trimmed_text(),
> "\n"
> for @bold;
> --8<---------------cut here---------------end--------------->8---


Voorbeeld verduidelijkt wel het een en ander maar ik weet niet door welke
tags de tekst omsloten wordt. <b> Hoeft dus niet aanwezig te zijn.

Voorbeeld was trouwens een simpele voorstelling van zaken waarschijnlijk
is de module niet flexibel genoeg.

Bedankt voor het meedenken.
Soortgelijke onderwerpen
Regex vraagje

Ik zoek in een stuk html naar een aantal regels die tussen <td> en </td> staan. Het gaat me om de regels die tussen BEGIN en EIND staan. De regex die 1 tdtje vindt is:...

perl regex lukt niet

"2Rowdy" <Harry131313> writes: > Ik probeer iets.iets.iets te halen uit deze regel: > 12 45 iets.iets.iets > <newline> > Uiteindelijk ben ik...

perl regex vraag

hi, uit een apache access.log wil ik het datum eruit prikken: 66.249.72.14 - - [05/Feb/2006:06:32:58 +0100] ^^^^^^^^^^^^^^^^^^^^ dit dus. dit probeer ik:

Perl vraagje

Hallo, Ik ben bezig met een perlscriptje. Dit is (vereenvoudigd) wat ik al heb: #!/usr/bin/perl $ls = `ls`; print $ls -al; De bedoeling is om de uitvoer van ls -al naar...


Alle tijden zijn in GMT. De tijd is nu 05:15. | Privacy Policy