|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
hilfe 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

|
re: 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

|
re: 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

|
hilfe 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

|
re: 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

|
re: 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

|
re: 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/perluse 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

|
re: 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

|
re: 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/perluse 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

|
re: 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/perluse 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

|
re: 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/perluse 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

|
re: 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

|
re: hilfe um HTML datei mittels perl zu parsen
|
Seitenanfang |
hi, ich habs so erledigt, das ist viel einfacher cool:-)
#!/usr/bin/perluse 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

|
|

|

|

|
 |

|

|
|