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

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Meta Tags von fremden Seiten parsen

Geschrieben von: Christoph Wille
Kategorie: ASP Tricks

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Das Dictionary Objekt - Dein Feind und Helfer
Erstellen eines HTTP Test Tools
Laden von Dateien aus dem Web mit ASP
Reguläre Ausdrücke / Regular Expressions
Sonderzeichen korrekt grabben mit XmlHttp
Webpage-Grabbing mit dem XML Parser

Links zu anderen Sites

AspGerman
AspTear
IE-HTML Digest

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.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

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