perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 22
Click for quality!




11.02.2012 / 20:10

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitraghilfe um HTML datei mittels perl zu parsen
Seitenanfang
hallo freunde ;
ich möchte gerne mal wissen, ob möglich wäre ein HTML file nach bestimmte infos zu durchsuchen, und dann extrahieren zu ein excel file,
die datei sieht so aus:
<TR>
<TD align=right><INPUT type=checkbox CHECKED
value="1894.252474 from(948.133513,2+) title(Elution%20from%3a%20777FinneganScanNumber%3a%202607) query(520)"
name=QUE></TD>
<TD alig=right><TT><I><B>948.13  </B></I></TT></TD> <TD align=right><TT><I><B>1894.25247  </B></I></TT></TD>
<TD>23334455 </TD>
<TD> </TD></TD></TR>
<TR>
...usw..

die datei ist in mehreren blöcke von <TR> und </TR> geteilt,
was ich gerne hätte, einfach dass jedes Block separat gehandelt wird, dh. zwischen jeder <TR> und </TR> wird diese value= nummer und from= Nummer(siehe oben) rausgepickt,
und dann in title() diese FinneganScanNumber Nummer auch.
auch die Nummern zwischen die<TD> würde ich gerne haben.
ich würde mich freuen auf jede HILFE;
tipps egal was, damit ichden roten Faden verfolgen kann:-))

Datum: 23.10.2007-01:08

Beitragre: hilfe um HTML datei mittels perl zu parsen
Seitenanfang
Eine Sache von 30 Sekunden


#!/usr/bin/perl

use strict;
use warnings;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;

$tree->parse_file('my_file.html');

foreach my $table_row ($tree->look_down('_tag' => 'tr')) {

foreach my $table_cell ($table_row->look_down('_tag' => 'td')) {

foreach my $input_field ($table_cell->look_down('_tag' => 'input')) {
print $input_field->attr('value'), "\n";
}
}
}

Datum: 23.10.2007-13:13

Beitragre: hilfe um HTML datei mittels perl zu parsen
Seitenanfang
danke für die Hilfe;
falls ich noch was zuklären hab, dann melde ich mich.,
greezzz.

Datum: 25.10.2007-10:57

Beitraghilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
Hallo dash:-)
Ich arbeite jetzt an ein Projekt, Diplomarbeit;und würde ich mich auf jede mögliche Hilfe; Ich habe mich mit tree::Builder und element beschäftigt, und meine erste Aufgabe wäre dann
-ich habe ein html file, und besteht aus mehreren Bloöcke von TR-tags 100 so etwa:
1-check ob irgendein 'Met'-string im TT-tag vorkommt, wenn ja, dann
2- look up zum oberen gehörigen TR-tag
3-dann ist bissle schwierig, ich arbeite auch daran, gib mir den Wert von VALUE attribut von INPUT-tag, aber nur der wert von der Ladung, in diesem Fall '2+' (steht zwischen from()innerhalb der VALUE attr oben)
dazu der Wert von 'FinneganScanNumber' ist in diesem Fall gleich '3539'und lieget in
' title() 'siehe auch oben.
4-gib mir alle werte der unten stehenden
TT-tags.
ich habe bis jetzt das probiert aber irgendwie klappt nicht??

use warnings;
use HTML::Element;
use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;

$tree->parse_file('C:/Documents and Settings/Mittler/Desktop/test.html');

foreach my $table_row ($tree->look_down('_tag' => 'tr')) {

foreach my $table_cell ($table_row->look_down('_tag' => 'td')) {

#foreach my $input_field ($table_cell->look_down('_tag' => 'input')) {

foreach my $input_field ($table_cell->look_down('_tag' => 'tt')) {
foreach my $test ($input_field->as_text){
if ($test =~ /Met/) {
print $test, "\n"; #als test ob es funzt!!

foreach my $lookup ($tree->look_up('_tag'=>'tr')) {
my @tags = $lookup->content_list;

foreach my $tag(@tags) {
print $tag->as_text;

}
}
}
}
}
}
}

print "ok!!!!!!";

und HTML Beispiel


<TR>
<TD align=right><INPUT type=checkbox CHECKED
value="1060.542634 from(531.278593,2+) title(Elution%20from%3a%20777%2e777%20to%20777%2e777%20period%3a%20dimer_02%2eraw%20experiment%3a%201%20cycles%3a%201%20precIntensity%3a%2080142%2e0%20FinneganScanNumber%3a%203539) query(5104)"
name=QUE></TD>
<TD align=right><TT><A
onmouseover="statusString = h1_q5104; if (!browser_EXCLUDE) activateEl('Q5104', event)"
onmouseout=clearEl()
href="http://pc15.immunbio.mpg.de/mascot/cgi/peptide_view.pl?file=../data/20070628/F002871.dat&query=5104&hit=2&index=gi11935049&px=1"
target=_blank>5104</A>  </TT></TD>
<TD align=right><TT><FONT
color=#ff0000><B>531.27859  </B></FONT></TT></TD>
<TD align=right><TT><FONT
color=#ff0000><B>1060.54263  </B></FONT></TT></TD>
<TD align=right><TT><FONT
color=#ff0000><B>1060.54001  </B></FONT></TT></TD>
<TD noWrap align=right><TT><FONT
color=#ff0000><B>0.00263 </B></FONT></TT></TD>
<TD align=right><TT><FONT
color=#ff0000><B>0  </B></FONT></TT></TD>
<TD noWrap align=right><TT><FONT
color=#ff0000><B>(19) </B></FONT></TT></TD>
<TD noWrap align=right><TT><FONT
color=#ff0000><B>2.4 </B></FONT></TT></TD>
<TD align=right><TT><FONT
color=#ff0000><B>1  </B></FONT></TT></TD>
<TD noWrap><TT><FONT color=#ff0000><B>R.TLLEGEESR.M + di-MetCarboxylation
(R)</B></FONT></TT></TD></TR>

ich freue mich auf irgendeine Hilfe, egal wie,
Greezzz and peaceeee:-))

Datum: 02.11.2007-17:18

Beitragre: hilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
Bei deinen obigen Code brauchst du kein look_up() zu machen, denn $table_row verweist noch auf das aktive <tr> .

Hier ein etwas kuerzerer Ansatz

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;

$tree->parse_file('C:/Documents and Settings/Mittler/Desktop/test.html');

my @table_rows = $tree->look_down(
'_tag' => 'tr',
sub {
$_[0]->look_down(
'_tag' => 'tt',
sub { $_[0]->as_text =~ /Met/ })
});

foreach my $table_row (@table_rows) {
my($input_field) = $table_row->look_down('_tag' => 'input');

print $input_field->attr('value'), "\n";
}

Jetzt benoetigst du nur noch einen Regexp, die split() oder index() um die Daten aus den 'value'-Attribut zu holen

Datum: 02.11.2007-23:10

Beitragre: hilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
danke dash , echt,
ich versuchs jetzt weiter zumachen und wenn s mal wieder hackt melde ich mich, ich bin näm. ehrgeizig bei sowas.:-)))
bis dennee

Datum: 03.11.2007-16:14

Beitragre: hilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
hi,
wie ich weiss die sub{} sind so prüf-methode, ob es zutrifft oder nicht,
ich habe versucht eine zusätzliche sub zu addieren, die nach Attr input erstmal sucht, also quasi,
1-look down nach tr
2-look down nach INPUT tag(also nur die blöcke die auch INPUT enthalten)
3-weiter mit tt tag umd Met string

my @table_rows = $tree->look_down(
'_tag' => 'tr',
#diese sub tut nix leider
sub {
$_[0]->look_down (
'_tag' => 'input')#hier??habe s mit dem #unteren sub geschachtelt und funktioniert #nicht??
};
#diese sub block unten funktioniert prima
sub {
$_[0]->look_down (
'_tag' => 'tt',
sub { $_[0]->as_text =~ /Met/ })}
);

mein script sieht so aus:

#!/usr/bin/perl

use strict;
use warnings;

print "wait please, program running!!!\n ";

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;

$tree->parse_file('C:/Documents and Settings/Mittler/Desktop/test.html');

my @table_rows = $tree->look_down(
'_tag' => 'tr',

sub {
$_[0]->look_down (
'_tag' => 'input')
};

sub {
$_[0]->look_down (
'_tag' => 'tt',
sub { $_[0]->as_text =~ /Met/ })}
);

foreach my $table_row (@table_rows) {
my($input_field) = $table_row->look_down('_tag' => 'input');

print $input_field->attr('value'), "\n";
foreach my $input_text ($table_row->look_down('_tag' => 'tt')){
#print $input_text->as_text;

my @array = $input_text->as_text;
print "$array[0]\n";#wie kan ich die gespeicherten daten in diese $array[0] position splitten?? dass ich dann nur welche davon ausgib.??so in andere variablen speichere.?

}
print"------------------------------------\n";

}

print "done!\n"

danke meister dash im voraus,

Datum: 05.11.2007-16:28

Beitragre: hilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
Du schreibst nicht ob du eine Fehlermeldung erhaelst und du bekommst bestimmt eine ;)

my @table_rows = $tree->look_down(
'_tag' => 'tr',

sub {
$_[0]->look_down (
'_tag' => 'input')
};

sub {
$_[0]->look_down (
'_tag' => 'tt',
sub { $_[0]->as_text =~ /Met/ })}
);


Du hast ein Semikolon statt ein Komma verwendet, wodurch die Liste ('_tag', 'tr', sub {}, sub {}) zu fruehzeitig abgeschlossen wird, ergo Syntaxfehler.

BTW: Solltest du eine groeszere Menge an Daten mit diesen Code verarbeiten wollen, dann empfiehlt es sich die anonymen Subroutinen zu entfernen und alles mit foreach-Schleifen zu durchlaufen (wie im ersten Codebeispiel). Die vielen Subroutinenaufrufe verlangsamen den Code extrem, im Moment werden fuer jedes HTML-Element unter dem aktuellen 3 Subroutinen aufgerufen.

Datum: 06.11.2007-01:39

Beitragre: hilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
hallo nochmal;
habe mich mit dein Vorschlag beschäftigt mit anstatt sub die foreach schleifen zubenutzen, habe so ein mix daruas gemacht unf tut wunderbar, nimmt zwar 100%cpu für 5 min aber ok.
so sieht s aus:


#!/usr/bin/perl

use strict;
use warnings;
use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;

$tree->parse_file('C:/Documents and Settings/Mittler/Desktop/test.html');

my @table_rows = $tree->look_down(
'_tag' => 'tr',

sub {
$_[0]->look_down (
'_tag' => 'input')
},

sub {
$_[0]->look_down(
'_tag' => 'tt',
sub { $_[0]->as_text =~ /Met/ })#meinst du findet da auch met also ob case sensitive ist?
});

foreach my $table_row (@table_rows) {
my($input_field) = $table_row->look_down('_tag' => 'input');

#print $input_field->attr('value'), "\n";
foreach my $input_text ($table_row->look_down('_tag' => 'tt')){
#print $input_text->as_text;
my $test = $input_text->as_text;
print $test; #di Ausgabe ist so aus:

#5104  
#531.27859  
#1060.54263  
#1060.54001  
#0.00263 
#0  
#(19) 
#2.4 
#1  
#R.TLLEGEESR.M + di-MetCarboxylation (R)
#================================
#5104  
#531.27859  
#1060.54263  
#1060.54001  
#0.00263 
#0  
#(19) 
#2.4 
#1  
#R.TLLEGEESR.M + di-Met4 (R)
#================================

my @array = split(" ",$test); #ich will ich #die werte in ein array pushen bis '=====',d.h #die obern werte als array elemente haben #damit ich dann #nur z.B $array[1] und [4][6] #ausgeben kann #und damit weiter arbeiten,und #auch z.B
#den letzten element 'R.TLLEGEESR.M + di-Met4 (R)'nochmal splitten..dass sie halt greifbar #sind.??
#das problem ist nach m splitten sind die #werte immer alle nur in $arry[0] position, #lassen sich nicht splitten??

#print $array[0],"\n";
my @array2;
foreach my $val (@array) {

#print "$val\n";
@array2 = split(" ", $val);

}
print $array2[2],"\n";#tut nix??
}

print"================================\n";
}

wie kann ich da vorgehen, oder wie lassen sich splitten??
danke betreuer meister:-))
Berbe

Datum: 09.11.2007-17:46

Beitragre: hilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
Du kannst die anonymen Subroutinen und damit auch die doppelte Ausfuehrung von look_down fuer 'input' und 'tt' wegfallen lassen.

#!/usr/bin/perl

use strict;
use warnings;
use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;

#$tree->parse_file('C:/Documents and Settings/Mittler/Desktop/test.html');

foreach my $table_row ($tree->look_down('_tag' => 'tr')) {

my($input_field) = $table_row->look_down('_tag' => 'input');

next unless defined $input_field;

print $input_field->attr('value'), "\n";

my($tt) = $table_row->look_down('_tag' => 'tt', sub { $_[0]->as_text =~ /Met/ });

next unless defined $tt;

print $tt->as_text(), "\n";
}

Datum: 10.11.2007-01:16

Beitragre: hilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
Und mit ein paar Handgriffen kommst du auch an all die anderen Werte ran:

#!/usr/bin/perl

use strict;
use warnings;
use HTML::TreeBuilder;
use URI::Escape ();

my $tree = HTML::TreeBuilder->new;

#$tree->parse_file('C:/Documents and Settings/Mittler/Desktop/test.html');

foreach my $table_row ($tree->look_down('_tag' => 'tr')) {

my($input_field) = $table_row->look_down('_tag' => 'input');

next unless defined $input_field;

my $input_field_value = $input_field->attr('value');

foreach my $input_field_chunk (split /\s+?/, $input_field_value) {
next if $input_field_chunk =~ /^\s*\n*\s*$/;

if(my($key, $value) = $input_field_chunk =~ m/(from|title|query)\( (.+?) \)/x) {

if($key eq 'title') {
$value = URI::Escape::uri_unescape($value);

if(my($finnegan_scan_number) = $value =~ m/FinneganScanNumber:\s* (\d+)/) {
print "Finnegan Scannumber:\t$finnegan_scan_number\n";
}
}

print "$key:\t$value\n";
}
else {
print "Foo Value:\t$input_field_chunk\n";
}
}

my(@tt) = $table_row->look_down('_tag' => 'tt');

next unless defined @tt;

foreach my $tt (@tt) {
my $text = $tt->as_text;

if($text =~ /Met/) {
print "[ $_ ]\t" for split /\s+/, $text;
print "\n";
}
else{
print "$text\n";
}
}
}

>> sub { $_[0]->as_text =~ /Met/ })#meinst du findet da auch met also ob case sensitive ist?

nur wenn du $_[0]->as_text =~ /Met/i verwendest, i -> ignore case

HTH

Datum: 10.11.2007-01:28

Beitragre: hilfe nochmal um HTML datei mittels perl zu parsen
Seitenanfang
respekt meister, ich bin auf m guten weg,
ich werde jetzt dein code mal analysieren und shau ma mal.
danke meister.
greezziii.
Berber

Datum: 10.11.2007-02:04

Beitragre: hilfe um HTML datei mittels perl zu parsen
Seitenanfang
hi,
ich habs so erledigt, das ist viel einfacher cool:-)

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;

$tree->parse_file('C:/Documents and Settings/Mittler/Desktop/test2.htm');

my @table_rows = $tree->look_down(
'_tag' => 'tr',

sub {
$_[0]->look_down (
'_tag' => 'input')
},

sub {
$_[0]->look_down(
'_tag' => 'tt',
sub { $_[0]->as_text =~ /Met/i })
});

foreach my $table_row (@table_rows) {
my($input_field) = $table_row->look_down('_tag' => 'input');

my ($ladung) = $input_field->attr('value') =~ m!,(.*?)\)!;
my ($scan) = $input_field->attr('value') =~ m!FinneganScanNumber%3a%20(\d+)!;
#print $input_field->attr('value'), "\n";
print "ladung = $ladung\n" ;
print "scanNumber = $scan \n" ;
############################################
############################################
my @array;

my @input_text =($table_row->look_down('_tag' => 'tt')) ;
foreach my $test(@input_text){
my $text = $test->as_text;
#print $test;

push(@array, split(/' '/,$text));

#print "$text";
#print "$array[1,2,3,9]\n";

}
my ($massobs,$massexp,$masscalc,$info) = @{array}[1,2,3,-1];
my ($seq,$mod) = split /\s*\+\s*/, $info;
#print $array[1,2,3,-1],"\n";
#print"@array\n";
print qq~
Mass Observed: $massobs
Mass exp: $massexp
Mass calc: $masscalc
Sequence: $seq
Modification: $mod
~;

print"================================\n";
}

nächste aufgabe wäre die Variablen 'Mass...' in ein EXCEL datein auszugeben;
hast du da eine Idee?module??dash
merci viel mal:-))dash

Datum: 26.11.2007-11:26

-






-
-