Perl Skript tut nicht wie es soll
pörl
- perl
0 Alexander (HH)0 pörl0 pörl
Hallo ich habe hier ein Perl-Skript, dass eigentlich aus einer HTML-Datei die URLs nach den Zeichenfolgen "<span class=a>" bis zum nächste Slash in eine Datei schreiben soll.
Das tut das Skript auch aber leider nur mit der ersten URL. Wo ist der Fehler??
#!C:\Perl\bin\perl.exe
open(IN,"$ARGV[0]") || die "Can not open file!";
open(OUT,">>datei.txt");
$counter = -1;
while(<IN>) {
$buf = $_;
$indx = index($buf,"<span class=a>");
if($indx != -1) {
$indx = $indx + 14;
$result = substr($buf,$indx);
$indx = index($result,"/");
$result = substr($result,0,$indx);
$bool = "no";
foreach $i (@buffa) {
if($i eq $result) { $bool = "found" };
}
if($bool eq "no") {
$counter++;
$buffa[$counter] = $result;
print "$result\n";
print OUT "$result\n";
}
}
}
close IN;
close OUT;
Moin Moin!
Warnungen sind aus => perl -w oder use warnings;
strict ist aus => use strict;
HTML ist mit REs und index nicht trivial zu bearbeiten. => HTML::Parser benutzen.
Diverse Fehlermöglichkeiten werden nicht abgefragt.
Der Rest wirkt auf mich eher wie Basic oder C, mit Perl hat das wenig zu tun. Perl hat push und grep, die schneller sind als die selbstgestrickten Nachbauten. Es wird jede Menge Zeugs sinnlos hin und her kopiert. Und wenn ich mir den Code genauer ansehen würde, fände ich vermutlich noch jede Menge weiterer Probleme. Das Script solltest Du besser dezent entsorgen.
Vielleicht erklärst Du erst einmal, was Du wirklich vor hast. Vermutlich gibt es eine schnellere und einfachere Lösung als Dein Script. Poste mal die vorhandene Eingabe-Datei (nicht erfinden, copy&paste, ggf. kürzen) und das gewünschte Ergebnis.
Alexander
Die Eingabe-Datei (IN): Ist einfach nur ein Google Suchergebnis als HTML-Seite abgespeichert(für die Formatierung kann ich nichts ;) + gekürzt):
<html><head><meta http-equiv=content-type content="text/html; charset=UTF-8"><title>katze - Google-Suche</title><style><!-- .ts td,.tc{padding:0}.ts,.tb{border-collapse:collapse}div,td{color:#000} .f{color:#666} .flc,.fl:link{color:#77c} a:link,.w,a.w:link,.w a:link,.q:visited,.q:link,.q:active,.q{color:#00c} a:visited,.fl:visited{color:#551a8b} a:active,.fl:active{color:red} .t{background:#e5ecf9;color:#000} .bb{border-bottom:1px solid #36c} .bt{border-top:1px solid #36c} .j{width:34em} .h{color:#36c} .i,.i:link{color:#a90a08} .a,.a:link{color:green} .z{display:none} div.n{margin-top:1ex} .n a{font-size:10pt;color:#000} .n .i{font-size:10pt;font-weight:bold} .b a{font-size:12pt;color:#00c;font-weight:bold} #np,#nn,.nr,#logo span,.ch{cursor:pointer;cursor:hand} .ta{padding:3px 3px 3px 5px}#tpa2,#tpa3{padding-top:9px}#gbar{float:left;font-weight:bold;height:22px;padding-left:2px}#gbh{border-top:1px solid #c9d7f1;font-size:0;height:0;position:absolute;right:0;top:24px;width:200%}#gbi{background:#fff;border:1px solid;border-color:#c9d7f1 #36c #36c #a2bae7;top:24px;z-index:1000}#guser{padding-bottom:7px !important}#gbar,#guser{font-size:13px;padding-top:1px !important}@media all{.gb1,.gb3{height:22px;margin-right:.73em;vertical-align:top}}#gbi,.gb2{visibility:hidden;position:absolute}.gb2{z-index:1001}#gbar a,#gbar a:active,#gbar a:visited{color:#00c;font-weight:normal}.gb2 a,.gb3 a{text-decoration:none}.gb2 a{display:block;padding:.2em .5em}#gbar .gb2 a:hover{background:#36c;color:#fff}.sl,.r{font-weight:normal;margin:0;display:inline} .sl{font-size:84%} .r{font-size:100%} .e{margin:.75em 0} .mblink:visited{color:#00c} .sm{display:block;margin:0;margin-left:40px} .slk td{padding-top:5px;padding-left:40px;vertical-align:top;font-size:84%}.slk div{text-indent:-10px;padding-left:10px}.csb,#navbar div,#logo span{background:url(/images/nav_logo3.png) no-repeat;overflow:hidden;height:26px} #navbar .nr{background-position:-60px 0;width:16px} #navbar #np{width:44px} #navbar #nf{background-position:-26px 0;width:18px} #navbar #nc{background-position:-44px 0;width:16px} #navbar #nn{background-position:-76px 0;width:66px;margin-right:34px} #navbar #nl{background-position:-76px 0;width:46px} #logo{display:block;width:150px;height:52px;position:relative;overflow:hidden;margin:15px 0 12px} #logo span{background-position:0 -26px;position:absolute;top:0;left:0;width:100%;height:100%} .ss{background:url(/images/nav_logo3.png) no-repeat;overflow:hidden;display:block;background-position:0 -87px;position:absolute;left:0;top:0}.cps{overflow:hidden;height:18px;width:114px}body,td,div,.p,a{font-family:arial,sans-serif} .g{margin:1em 0} #sd{font-size:113%;font-weight:bold} #ap{font-size:64%} --></style> <script>window.google={kEI:"9s-LR5efBYeg-gKXiPCgDw",kEXPI:"17259,17537,17735,17900",kHL:"de"}; window.clk=function(b,c,d,e,f,g){if(document.images){var a=encodeURIComponent||escape;(new Image).src="/url?sa=T"+(c?"&oi="+a(c):"")+(d?"&cad="+a(d):"")+"&ct="+a(e)+"&cd="+a(f)+(b?"&url="+a(b.replace(/#.*/,"")).replace(/+/g,"%2B"):"")+"&ei=9s-LR5efBYeg-gKXiPCgDw"+g}return true}; window.gbar={};(function(){;var i=window.gbar,a,n,b,o="visible";function p(c,g,f){c.visibility=c.visibility==o?"hidden":o;c.left=g+"px";c.top=f+"px"}i.tg=function(c){var g=0,f,d,k,e=0,h=0,l=window.navExtra;!n&&(n=document.getElementById("gbar"));!b&&(b=n.getElementsByTagName("span"));(c||window.event).cancelBubble=true;if(!a){a=document.createElement(Array.every||window.createPopup?"iframe":"div");a.frameBorder="0";a.id="gbi";a.scrolling="no";a.src="#";document.body.appendChild(a);if(l&&b[8])for(var q in l){var m=document.createElement("span");m.appendChild(l[q]);m.className="gb2";b[0].parentNode.insertBefore(m,b[8])}document.onclick=i.close}for(;b[e];e++){d=b[e];k=d.className;if(k=="gb3"){f=d.offsetLeft;while(d=d.offsetParent)f+=d.offsetLeft}else if(k=="gb2"){p(d.style,f+1,25+g);h=Math.max(h,d.offsetWidth);g+=20}}for(e=0;b[e];e++){if(b[e].className=="gb2"){b[e].style.width=h+"px"}}var j=a.style;j.height=g+"px";j.width=h+"px";p(j,f,24)};i.close=function(c){a&&a.style.visibility==o&&i.tg(c)};})();</script></head><body bgcolor=#ffffff topmargin=3 marginheight=3><div id=gbar><nobr><span class=gb1>Web</a></span> <span class=gb1><a href="http://images.google.de/images?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wi">Bilder</a></span> <span class=gb1><a href="http://maps.google.de/maps?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wl">Maps</a></span> <span class=gb1><a href="http://news.google.de/news?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wn">News</a></span> <span class=gb1><a href="http://www.google.de/products?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wf">Shopping</a></span> <span class=gb1><a href="http://mail.google.com/mail/?um=1&ie=UTF-8&sa=N&tab=wm">Mail</a></span> <span class=gb3><a href="http://www.google.de/intl/de/options/" onclick="this.blur();gbar.tg(event);return false"><u>Mehr</u> <span style=font-size:11px>▼</span></a></span> <span class=gb2><a href="http://blogsearch.google.de/blogsearch?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wb">Blogs</a></span> <span class=gb2><a href="http://books.google.de/books?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wp">Bücher</a></span> <span class=gb2><a href="http://docs.google.com/?um=1&ie=UTF-8&sa=N&tab=wo">Dokumente</a></span> <span class=gb2><a href="http://picasaweb.google.de/lh/searchbrowse?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wq">Fotos</a></span> <span class=gb2><a href="http://groups.google.de/groups?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wg">Groups</a></span> <span class=gb2><a href="http://www.google.com/calendar/render?um=1&ie=UTF-8&sa=N&tab=wc">Kalender</a></span> <span class=gb2><a href="http://www.google.de/reader/view/?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wy">Reader</a></span> <span class=gb2><a href="http://video.google.de/videosearch?hl=de&q=katze&um=1&ie=UTF-8&sa=N&tab=wv">Video</a></span> <span class=gb2><a href="http://www.google.de/intl/de/options/">und noch mehr »</a></span> </nobr></div><div id=gbh></div><div align=right id=guser style="font-size:84%;padding:0 0 4px" width=100%><nobr><a href="https://www.google.com/accounts/Login?continue=http://www.google.de/search%3Fhl%3Dde%26q%3Dkatze%26meta%3D&hl=de">Anmelden</a></nobr></div><table class=tb style=clear:left width=100%><tr><form name=gs method=GET action=/search><td class=tc valign=top><a id=logo href="http://www.google.de/webhp?hl=de" title="Gehe zur Google Homepage">Google<span></span></a></td><td style="padding:0 0 7px;padding-left:8px" valign=top width=100%><table class=tb style=margin-top:25px><tr><td class=tc nowrap><input type=hidden name=hl value="de"><input type=text name=q size=41 maxlength=2048 value="katze" title="Suche"> <input type=submit name="btnG" value="Suche"></td><td class=tc nowrap width=100%><span id=ap> <a href=/advanced_search?q=katze&hl=de>Erweiterte Suche</a><br> <a href=/preferences?q=katze&hl=de>Einstellungen</a></span></td></tr><tr><td class=tc colspan=2><font size=-1> Suche: <input id=all type=radio name=meta value="" checked><label for=all> Das Web </label><input id=lgr type=radio name=meta value="lr=lang_de"><label for=lgr> Seiten auf Deutsch </label><input id=cty type=radio name=meta value="cr=countryDE"><label for=cty> Seiten aus Deutschland </label> </font></td></tr></table></td></tr></form></table><table border=0 cellpadding=0 cellspacing=0 width=100% class="t bt"><tr><td nowrap><span id=sd> Web </span></td><td align=right nowrap><font size=-1>Ergebnisse <b>1</b> - <b>10</b> von ungefähr <b>20.700.000</b> für <b>katze</b>. (<b>0,22</b> Sekunden) </font></td></tr></table><div id=res><div><div class=g><h2 class=r><a href="http://de.wikipedia.org/wiki/Hauskatze" class=l onmousedown="return clk(this.href,'','','res','1','')">Hauskatze - Wikipedia</a></h2><table border=0 cellpadding=0 cellspacing=0><tr><td class="j"><font size=-1>Die Hauskatze (Felis catus) ist ein fleischfressendes, zu den <b>Katzen</b> gehörendes <b>....</b> Die <b>Katze</b> hat einen sehr guten Gleichgewichtssinn. <b>Katzen</b> sind auch in <b>...</b><br><span class=a>de.wikipedia.org/wiki/Haus<b>katze</b> - 206k - </span><nobr><a class=fl href="http://209.85.129.104/search?q=cache:hJAKA0gO68cJ:de.wikipedia.org/wiki/Hauskatze+katze&hl=de&ct=clnk&cd=1&gl=de">Im Cache</a> - <a class=fl href="/search?hl=de&q=related:de.wikipedia.org/wiki/Hauskatze">Ähnliche Seiten</a></nobr></font></td></tr></table></div> <div class=g style="margin-left:2.5em;"><h2 class=r><a href="http://de.wikipedia.org/wiki/Katze" class=l onmousedown="return clk(this.href,'','','res','2','')"><b>Katze</b> - Wikipedia</a></h2><table border=0 cellpadding=0 cellspacing=0><tr><td class="j hc"><font size=-1>im Festungsbau eine erhöhte Geschützstellung, siehe <b>Katze</b> <b>...</b> Wiktionary: <b>Katze</b> – Bedeutungserklärungen, Wortherkunft, Synonyme und Übersetzungen <b>...</b><br><span class=a>de.wikipedia.org/wiki/<b>Katze</b> - 15k - </span><nobr><a class=fl href="http://209.85.129.104/search?q=cache:p1cSGrtjgSsJ:de.wikipedia.org/wiki/Katze+katze&hl=de&ct=clnk&cd=2&gl=de">Im Cache</a> - <a class=fl href="/search?hl=de&q=related:de.wikipedia.org/wiki/Katze">Ähnliche Seiten</a></nobr><br><a class=fl href="/search?hl=de&q=+site:de.wikipedia.org+katze">Weitere Ergebnisse von de.wikipedia.org »</a></font></td></tr></table></div> <div class=g><h2 class=r><a href="http://www.geliebte-katze.de/" class=l onmousedown="return clk(this.href,'','','res','3','')">Geliebte <b>Katze</b> :: GK Startseite</a></h2><table border=0 cellpadding=0 cellspacing=0><tr><td class="j"><font size=-1>Auf Geliebte <b>Katze</b> finden Sie alle Informationen, aktuelle News, Tipps und Ratschläge zu <b>Katzen</b>. Legen Sie in der TierCommunity Ihren eigenen <b>Katzen</b> Blog an <b>...</b><br><span class=a>www.geliebte-<b>katze</b>.de/ - 55k - </span><nobr><a class=fl href="http://209.85.129.104/search?q=cache:kqjk_rfsWAUJ:www.geliebte-katze.de/+katze&hl=de&ct=clnk&cd=3&gl=de">Im Cache</a> - <a class=fl href="/search?hl=de&q=related:www.geliebte-katze.de/">Ähnliche Seiten</a></nobr></font></td></tr></table></div> <div class=g><h2 class=r><a href="http://www.welt-der-katzen.de/index2.html" class=l onmousedown="return clk(this.href,'','','res','4','')">Welt der <b>Katzen</b>-<b>Katzen</b> der Welt * DAS Katzenportal</a></h2><table border=0 cellpadding=0 cellspacing=0><tr><td class="j"><font size=-1>Die Welt der <b>Katzen</b> - DAS Katzenportal ... mit Informationen und Bildern zu Wildkatzen (Gross- und Kleinkatzen) sowie Haus- und Rassekatzen.<br><span class=a>www.welt-der-<b>katze</b>n.de/index2.html - 64k - </span><nobr><a class=fl href="http://209.85.129.104/search?q=cache:Epihne3bvF4J:www.welt-der-katzen.de/index2.html+katze&hl=de&ct=clnk&cd=4&gl=de">Im Cache</a> - <a class=fl href="/search?hl=de&q=related:www.welt-der-katzen.de/index2.html">Ähnliche Seiten</a></nobr></font></td></tr></table></div> <div class=g><h2 class=r><a href="http://www.mietzmietz.de/" class=l onmousedown="return clk(this.href,'','','res','5','')">Mietz Mietz Katzenforum</a></h2><table border=0 cellpadding=0 cellspacing=0><tr><td class="j"><font size=-1>Umfangreiche Informationen zu den Themen Katzenpflege, Krankheiten, Ernährung und Zucht. Von Usern geschriebene Artikel´.<br><span class=a>www.mietzmietz.de/ - 2k - </span><nobr><a class=fl href="http://209.85.129.104/search?q=cache:XMbemDDA6ewJ:www.mietzmietz.de/+katze&hl=de&ct=clnk&cd=5&gl=de">Im Cache</a> - <a class=fl href="/search?hl=de&q=related:www.mietzmietz.de/">Ähnliche Seiten</a></nobr></font></td></tr></table></div> <div class=g><h2 class=r><a href="http://www.katze-rock.de/" class=l onmousedown="return clk(this.href,'','','res','6','')">katze_krautpop</a></h2><table border=0 cellpadding=0 cellspacing=0><tr><td class="j"><font size=-1><b>K A T Z E</b> PRODUKTE könnt ihr jetzt live und direkt im lokalkolorit <b>...</b> <b>katze</b> merch direkt zum anprobieren und austesten. schlesische strasse 32 <b>...</b> ...
Ach und das gewünschte Ergebnis:
Jeweils der Text nach der Zeichenfolge "<span class=a>" bis zum Zeichen "/" (also den Host) in eine Datei schreiben.
Moin Moin!
Ach und das gewünschte Ergebnis:
Jeweils der Text nach der Zeichenfolge "<span class=a>" bis zum Zeichen "/" (also den Host) in eine Datei schreiben.
Fang mit HTML::Parser an. Lasse eine Funktion/Methode aufrufen, sobald der Parser über <span>-Tags stolpert. Springe sofort zurück, wenn dem Tag das passende Class-Attribut fehlt. Siehe ähnlicher Beispielcode in der Doku, der den Inhalt des Title-Tags ausgibt.
Aus dem eigentlich interessantem Text kannst Du mit $text=~s|/.*||s alles nach dem ersten Slash entfernen, bevor Du den Text ausgibst.
Alexander
Hi,
leider kann ich nicht wirklich viel in Perl, eher in PHP.
Kannst du mir schreiben was du genau mit
Lasse eine Funktion/Methode aufrufen, sobald der Parser über <span>-Tags stolpert.
und
Springe sofort zurück, wenn dem Tag das passende Class-Attribut fehlt.
meinst?
Quelltext wäre auch hilfreich.
Vielen Dank
pörl
leider kann ich nicht wirklich viel in Perl, eher in PHP.
Perl kann man lernen, sollte man auch, wenn man sowas komplexes wie das Parsen von HTML mit Perl erledigen möchte. Ansonsten sieht es so aus, als wäre das Ergebnis-HTML unformatiert, also ohne Zeilenumbrüche. Das würde zumindest erklären, warum Dein Code nur das erste Vorkommen liefert.
Quelltext wäre auch hilfreich.
Da musst Du schon selber ran:
Doku zum Modul: http://search.cpan.org/dist/HTML-Parser/Parser.pm
Kurztutorial: http://faq.perl-community.de/bin/view/Wissensbasis/FaqBenutzungModuleHTMLParser
Siechfred