Inneren Textteil gewinnen

Inneren Textteil gewinnen

am 28.02.2007 15:57:19 von unknown

Post removed (X-No-Archive: yes)

Re: Inneren Textteil gewinnen

am 28.02.2007 16:07:28 von Bjoern Hoehrmann

* Stefan Ram wrote in de.comp.lang.perl.misc:
> Um den inneren Text aus "..." zu ermitteln verwende ich:
>
> $text =~ m{^(.*)$};
> $text = $1;
>
> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
> um die umgebenden Textteile "" und "" zu entfernen.

Mich dünkt es wäre leichter

$text =~ s{^(.*)$}{$1};

zu schreiben.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Re: Inneren Textteil gewinnen

am 28.02.2007 16:08:20 von Frank Seitz

Stefan Ram wrote:
> Um den inneren Text aus "..." zu ermitteln verwende ich:
>
> $text =~ m{^(.*)$};
> $text = $1;
>
> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
> um die umgebenden Textteile "" und "" zu entfernen.

Wieso, willst Du einen Schönheitspreis gewinnen?
TMTOWTDI

Ich würde es so machen:

$text =~ s|^(.*)$|$1|;

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Inneren Textteil gewinnen

am 28.02.2007 16:13:57 von Mirco Wahab

Stefan Ram wrote:
> Um den inneren Text aus "..." zu ermitteln verwende ich:
> $text =~ m{^(.*)$};
> $text = $1;
> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
> um die umgebenden Textteile "" und "" zu entfernen.

Hier kann imho 'greedy match' schnell schiefgehen,
vgl.:


use strict;
use warnings;

my $tagsoup='
<1> auf eine Zeile
<2a> zwei auf einer Zeile <2b> zwei pro Zeile
<3> auf zwei
Zeilen

<4a> auf
drei ganzen
Zeilen und dahinter
<4b> dahinter
';

my $rg = qr{(.*?)}ims;

print "$1\n" while $tagsoup =~ /$rg/g;



Viele Grüße

Mirco

Re: Inneren Textteil gewinnen

am 28.02.2007 17:22:46 von rs

Mirco Wahab wrote:
> Stefan Ram wrote:
>> Um den inneren Text aus "..." zu ermitteln verwende ich:
>> $text =~ m{^(.*)$};
>
> Hier kann imho 'greedy match' schnell schiefgehen,

IMHO nicht, mit den ^ und $ ;)

Re: Inneren Textteil gewinnen

am 28.02.2007 17:58:21 von Helmut Wollmersdorfer

Mirco Wahab wrote:
> Stefan Ram wrote:
>> Um den inneren Text aus "..." zu ermitteln verwende ich:
>> $text =~ m{^(.*)$};
>> $text = $1;
>> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
>> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
>> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
>> um die umgebenden Textteile "" und "" zu entfernen.
>
> Hier kann imho 'greedy match' schnell schiefgehen,
> vgl.:

Deswegen hier ein Beispiel, wie ich das üblicherweise mit der
Holzhammermethode mache:

#XPath does NOT work: returns 'text' instead of $node,
# IF 'text'
#my $raw_node = $jv->find('td[2]',$tr);
#--------------------------------------

my $raw = XML::XPath::XMLParser::as_string( $tr );
$raw =~ s|\n||g;
$raw =~ s|<[/]*t[rd]\s*[^>]*>||g;
$raw =~ s|<[/]*span\s*[^>]*>||g;
$raw =~ s|]*>|\n|g;
$raw =~ s|^[^:]+:||g;
$raw =~ s|]*>\s*([^<]*)|$1 $2|g;

> <1> auf eine Zeile

A) s|<\s*[/]*b[^>]*>||g

> <2a> zwei auf einer Zeile <2b> zwei pro Zeile

siehe A)

> <3> auf zwei
> Zeilen


B) s|[\n\r]||g
(danach nach eigenem Geschmack wieder \n einfügen)

> <4a> auf
> drei ganzen
> Zeilen und dahinter
<4b> dahinter

Siehe B) + A)

Helmut Wollmersdorfer

Re: Inneren Textteil gewinnen

am 28.02.2007 18:01:57 von unknown

Post removed (X-No-Archive: yes)

Re: Inneren Textteil gewinnen

am 28.02.2007 18:50:29 von Bjoern Hoehrmann

* Stefan Ram wrote in de.comp.lang.perl.misc:
>Bjoern Hoehrmann writes:
>>$text =~ s{^(.*)$}{$1};
>
> Ich danke für Deine Antwort und die anderen Antworten!
>
> Meine beiden Zeilen kamen mir irgendwie zu umständlich
> vor (deswegen fragte ich), aber ich kam selber nicht
> auf die kürzere Lösung.
>
> Es liegt wahrscheinlich daran, daß ich mehrere Teile
> folgendermaßen extrahiere:
>
> $text =~ m{^(.*)(.*)$};
> my $bold = $1;
> my $ital = $2;

Das wäre dann

my ($bold, $ital) = m{^(.*)(.*)$};
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Re: Inneren Textteil gewinnen

am 28.02.2007 19:39:49 von unknown

Post removed (X-No-Archive: yes)

Re: Inneren Textteil gewinnen

am 01.03.2007 07:51:25 von Joachim Pimiskern

Stefan Ram schrieb:
> Um den inneren Text aus "..." zu ermitteln verwende ich:
>
> $text =~ m{^(.*)$};
> $text = $1;

Warum nimmste nicht HTML::Parser?

$o = MyHtmlParser->new();
my ($title,
$meta_keywords,
$meta_description,
$meta_robots,
$words,
$links,
$cached)= $o->analyze($html);

Beispiel siehe
http://www.augos.com/temp/MyHtmlParser.pm

Grüße,
Joachim

Re: Inneren Textteil gewinnen

am 01.03.2007 10:47:28 von Ferry Bolhar

Stefan Ram:

>> $text =~ m{^(.*)$};
>> $text = $1;

Dir ist aber schon klar, was du damit bei einem Text wie

Ein Testdernichtwirklichgutgehen wird

bekommen wirst?

..* ist gefährlich, weil es _alles_ matcht, auch .., die
innerhalb des zu matchenden Strings mehrfach auftauchen.
Hier wäre die Verwendung von

(.*?)

wohl der sichere Weg. Aber auch dein Ansatz kann durchaus
passen, es hängt nur ab, wie der zu durchsuchende Text aussieht
(d.h., wenn du ausschließen kannst, dass innerhalb einer Zeile
... mehrfach vorkommt, dann ist dein Ausdruck auch
ok). Ich wollte nur auf diese Falle aufmerksam machen.

Der Vorschlag von Björn wäre dann entsprechend in

$text =~ s{(.*?)}{$1}g;

abzuändern.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Inneren Textteil gewinnen

am 01.03.2007 10:54:34 von Uwe Voelker

Hallo Stefan,

> Um den inneren Text aus "..." zu ermitteln verwende ich:
>
> $text =~ m{^(.*)$};
> $text = $1;
>
> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
> um die umgebenden Textteile "" und "" zu entfernen.

Bei so kleinen HTML-Snippets lohnt sich das vielleicht noch nicht, aber
bei größeren (oder kompletten Dokumenten) habe ich sehr gute Erfahrungen
mit HTML::TreeBuilder bzw. HTML::TreeBuilder::XPath gemacht. Gerade
letzteres erlaubt Dir eine supereinfache Suche nach bestimmten
Elementen. Das ganze ist fast selbstdokumentierend (solange man etwas
XPath beherrscht).

Ich verwende das zum Beispiel um die Ausgabe von Text::Restructured nach
meinen Wünschen anzupassen (Body heraustrennen, Überschriften neu
nummerieren usw.)

Allerdings steigt HTML::TreeBuilder::XPath bei falsch genesteten Tags
aus. (Ich weiß jetzt nicht mehr, ob HTML::TreeBuilder damit noch
zurechtkam.)


Tschüs, Uwe

--
http://www.perl-uwe.de/ - Tipps und Tricks zu Perl und CPAN-Modulen

Re: Inneren Textteil gewinnen

am 01.03.2007 11:31:15 von Helmut Wollmersdorfer

Uwe Voelker wrote:

> Allerdings steigt HTML::TreeBuilder::XPath bei falsch genesteten Tags
> aus. (Ich weiß jetzt nicht mehr, ob HTML::TreeBuilder damit noch
> zurechtkam.)

Das ist z.B. das Problem, wenn Du sehr viele, fremde HTML-Seiten parst.
Da kannst Du nicht auf fast garnichts verlassen, weshalb ich dafür ein
recht umfangreiches Musterscript aus Regular Expressions verwende, die
ich nach Bedarf auskommentiere oder abändere.

Hängt natürlich auch alles vom angestrebten Zweck ab. Wenn die
ausgelesenen Daten nicht 100% vollständig sein müssen, kann es sich z.B.
bewähren, mittels Regex sehr enge Filter zu bauen, welche nur die
interessanten Strings auslesen, und den Rest ignorieren.

Bei maschinengeneriertem HTML von guter Qualität bin ich von XPath auch
begeistert.

Helmut Wollmersdorfer

Re: Inneren Textteil gewinnen

am 01.03.2007 12:56:32 von Ferry Bolhar

Robert Sedlacek:

>> Hier kann imho 'greedy match' schnell schiefgehen,
>
> IMHO nicht, mit den ^ und $ ;)

Das setzt aber voraus, dass jede Zeile nur genau einmal

...

(vorher und nachher nichts) enthält.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Inneren Textteil gewinnen

am 01.03.2007 13:11:07 von Frank Seitz

Ferry Bolhar wrote:
> Robert Sedlacek:

>>>Hier kann imho 'greedy match' schnell schiefgehen,
>>
>>IMHO nicht, mit den ^ und $ ;)
>
> Das setzt aber voraus, dass jede Zeile nur genau einmal
>
> ...
>
> (vorher und nachher nichts) enthält.

Genau so hatte der OP das Problem nunmal beschrieben.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Inneren Textteil gewinnen

am 01.03.2007 13:30:35 von rs

Ferry Bolhar wrote:
> Robert Sedlacek:
>
>>> Hier kann imho 'greedy match' schnell schiefgehen,
>> IMHO nicht, mit den ^ und $ ;)
>
> Das setzt aber voraus, dass jede Zeile nur genau einmal
>
> ...
>
> (vorher und nachher nichts) enthält.
>
> LG, Ferry

Das war die Version des OPs, insofern: Eben.

--
# Robert 'phaylon' Sedlacek
# Perl 5/Catalyst Developer in Hamburg, Germany
{ EMail => ' rs@474.at ', Web => ' http://474.at ' }

Re: Inneren Textteil gewinnen

am 01.03.2007 15:59:04 von unknown

Post removed (X-No-Archive: yes)