Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Meta Tags von fremden Seiten parsen

Geschrieben von: Christoph Wille
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

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 Ausgangsskript

Das 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 Skript

Hier 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 Seiten

Punkt 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ßbemerkung

Dieser 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.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010803.zip

Verwandte Artikel

Das Dictionary Objekt - Dein Feind und Helfer
http:/www.aspheute.com/artikel/19990806.htm
Erstellen eines HTTP Test Tools
http:/www.aspheute.com/artikel/20000508.htm
Laden von Dateien aus dem Web mit ASP
http:/www.aspheute.com/artikel/20000519.htm
Reguläre Ausdrücke / Regular Expressions
http:/www.aspheute.com/artikel/20000829.htm
Sonderzeichen korrekt grabben mit XmlHttp
http:/www.aspheute.com/artikel/20011113.htm
Webpage-Grabbing mit dem XML Parser
http:/www.aspheute.com/artikel/20010328.htm

Links zu anderen Sites

AspGerman
http://www.aspgerman.com/aspgerman/
AspTear
http://www.alphasierrapapa.com/componentcenter/asptear/
IE-HTML Digest
http://faqchest.dynhost.com/msdn/IE-HTML/script-99/script-9911/script99112506_20925.html

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.