Meta Tags von fremden Seiten parsen
Geschrieben von: Christoph Wille Mit diesem Artikel greife ich eine Frage aus der aspDEcoffeehouse Liste von AspGerman auf - wie kann man, wenn man eine Seite einer fremden Website als String vor sich hat, die Meta Tags daraus extrahieren, und dann mit den Namen/Werten weiterarbeiten? Wie bei den AspGerman Listen so üblich, gab es eine Lösung. Diese hatte allerdings einen "Haken" - das vorgeschlagene Skript, stammend aus dem IE-HTML Digest war einerseits client-seitig, und andererseits in JavaScript geschrieben. Die Frage daher: wie bekomme ich das auf den Server, und wie verwende ich es wenn ich in VBScript programmiere? Das client-seitige AusgangsskriptDas Script, das im Download als clientjstest.asp verfügbar ist, stammt aus dem IE-HTML Digest, und ich habe es klarerweise zuallererst unverändert getestet (die Variable sHeadHtml ist der Lesbarkeit halber gekürzt): <SCRIPT LANGUAGE-"JScript"> var sHeadHtml = '< META NAME = "AuthorName" CONTENT=" Geor .....'; function ShowMetaTags() { var aMetaMatch = sHeadHtml.match(/<\s*META[^>]*>/gi); { if (!aMetaMatch) return false; var iNumMeta = aMetaMatch.length; for (var i=0;i<iNumMeta;i++) { var sMetaMatch = aMetaMatch[i]; var aAttMatch = sMetaMatch.match(/NAME\s*=\s*(["][^"]*["]|\S*)\s+ [line continued]CONTENT\s*=\s*(["][^"]*["]|\S*)\s*/i); window.alert("Tag: " + sMetaMatch); window.alert("Name: " + RegExp.$1); window.alert("Content: " + RegExp.$2); } } } </SCRIPT> <BUTTON ONCLICK="ShowMetaTags();">Show Meta Tags</BUTTON> Jawohl, das Skript erfüllt seinen Zweck - also werden wir es jetzt in ein serverseitiges Skript umbauen. Konvertierung auf serverseitiges SkriptHier gäbe es zwei Varianten - Variante 1 ist, das Skript von JavaScript auf VBScript umzuprogrammieren. Das ist mir aber zu viel Arbeit. Ich habe mich für Variante 2 entschieden: das JavaScript für serverseitige Ausführung anpassen, und von VBScript aus aufrufen - und dabei das nette Feature von ASP ausnutzen, auf einer Seite mehrere Skriptsprachen mischen zu können. Ganz so einfach wollte ich es mir auch nicht machen - deshalb stecke ich die gefundenen Meta Tags in ein Dictionary - und da ich es nur auf derselben Seite verwende, handle ich mir auch keine Threadingprobleme ein. Der Parsing-Code ist in der JavaScript Funktion ParseMetaTags enthalten, der Aufruf geschieht von VBScript aus (ParseMetaTags.asp). <% @Language=VBScript %> <% Option Explicit Dim sHeadHtml, objDict, arrTags, arrTagValues, i sHeadHtml = "< META NAME = ""AuthorName"" CONTENT="" ....." Set objDict = Server.CreateObject("Scripting.Dictionary") Call ParseMetaTags(sHeadHtml, objDict) arrTags = objDict.Keys arrTagValues = objDict.Items For i = 0 To (objDict.Count -1) Response.Write arrTags(i) & " " & arrTagValues(i) & "<br>" Next Set objDict = Nothing %> <script language="jscript" runat="server"> function ParseMetaTags(strText2Parse, objDictionary) { var aMetaMatch = strText2Parse.match(/<\s*META[^>]*>/gi); { if (!aMetaMatch) return false; var iNumMeta = aMetaMatch.length; for (var i=0;i<iNumMeta;i++) { var sMetaMatch = aMetaMatch[i]; var aAttMatch = sMetaMatch.match(/NAME\s*=\s*(["][^"]*["]|\S*)\s+ [line continued]CONTENT\s*=\s*(["][^"]*["]|\S*)\s*/i); objDictionary.Add(RegExp.$1, RegExp.$2); } } } </script> Die Idee mit dem Dictionary dient dazu, später bequem nach bestimmten Meta Tags suchen zu können. Wenn man das nicht vorhat, würde ein simples Array ausreichen. Wir parsen fremde SeitenPunkt 1 beim Parsen von Seiten von fremden Servern ist der, sich die Seite erst einmal zu holen. Dies habe ich der Einfachheit halber ohne große Fehlerbehandlung mittels AspTear realisiert (Links zu Download und detaillierteren Artikeln am Ende des heutigen). Der gesamte Sourcecode ist in der Datei ParseRemoteSite.asp des heutigen Downloads enthalten. <script language="vbscript" runat="server"> Function RetrievePageGet(ByVal strWebDatei) Dim objAspTear, strDateiInhalt Set objAspTear = Server.CreateObject("SOFTWING.ASPtear") strDateiInhalt = objAspTear.Retrieve(strWebDatei, 2, "", "", "") Set objAspTear = Nothing RetrievePageGet = strDateiInhalt End Function </script> Diese Funktion liefert mir also das Dokument, das ich parsen will. Dieses übergebe ich dann wieder der Funktion ParseMetaTags, die nun noch einen zusätzlichen Check enthält, ob das Tag nicht schon im Dictionary enthalten ist: <script language="jscript" runat="server"> function ParseMetaTags(strText2Parse, objDictionary) { var aMetaMatch = strText2Parse.match(/<\s*META[^>]*>/gi); { if (!aMetaMatch) return false; var iNumMeta = aMetaMatch.length; for (var i=0;i<iNumMeta;i++) { var sMetaMatch = aMetaMatch[i]; var aAttMatch = sMetaMatch.match(/NAME\s*=\s*(["][^"]*["]|\S*)\s+ [line continued]CONTENT\s*=\s*(["][^"]*["]|\S*)\s*/i); if (!objDictionary.Exists(RegExp.$1)) { objDictionary.Add(RegExp.$1, RegExp.$2); } } } } </script> Damit hätten wir alle Grundfunktionalitäten abgedeckt. Der Aufruf der entsprechenden Funktionen ist nun wieder einfaches VBScript: <% @Language=VBScript %> <% Option Explicit Dim sHeadHtml, objDict, arrTags, arrTagValues, i sHeadHtml = RetrievePageGet("http://strangelove/default.asp") Set objDict = Server.CreateObject("Scripting.Dictionary") Call ParseMetaTags(sHeadHtml, objDict) arrTags = objDict.Keys arrTagValues = objDict.Items For i = 0 To (objDict.Count -1) Response.Write arrTags(i) & " " & arrTagValues(i) & "<br>" Next Set objDict = Nothing %> Damit erhält man eine Liste von Meta Tags und ihren Werten. Durch die Suchfunktionen des Dictionary kann man allerdings "intelligentere" Verarbeitungswege einschlagen, als den hier gezeigten. SchlußbemerkungDieser Artikel sollte zeigen, daß nur weil ein Beispiel client-seitiger Code ist, noch dazu in einer Programmiersprache die man normalerweise nicht verwendet, dies noch lange kein Hinderungsgrund ist, sich die Funktionalität dieses Codes in eigene server-seitige Scripts einzuverleiben. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Das Dictionary Objekt - Dein Feind und Helfer Links zu anderen Sites
AspGerman Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |