kostenloser Webspace werbefrei: lima-city


Meta-Tags mit JS auslesen ?

lima-cityForumDie eigene HomepageHTML, CSS & Javascript

  1. Autor dieses Themas

    swibud

    swibud hat kostenlosen Webspace.

    Hallo

    gibt es eine Möglichkeit um Meta-Tags (title, description, keywords)
    von einer "fremden" Seite (anderer Server) per JS auszulesen ?

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Per Js weniger, aber via Curl geht das 1a.

    Schau dir mal das Tut an , da wird genau beschrieben wie du Teile einer Website Scrapen kannst

    http://www.jacobward.co.uk/web-scraping-with-php-curl-part-1/

    ist alles super beschrieben.
  4. Autor dieses Themas

    swibud

    swibud hat kostenlosen Webspace.

    hmmm, ok, mit curl kann ich den Inhalt (HTML-Code) einlesen,
    (... dann ist das hier wohl eher was für's PHP Forum)

    aber ich bekomme Probleme beim Meta-Tags extrahieren (mit regex-Pattern)

    ich habe 3 mal preg_match() Anweisung

    preg_match("@<title>(.*)</title>@iUs", $contents, $match1);
    preg_match("@<meta name=['|\"]description['|\"] content=['|\"](.*)['|\"]@iUs", $contents, $match2);
    preg_match("@<meta name=['|\"]keywords['|\"] content=['|\"](.*)['|\"]@iUs", $contents, $match3);


    Das funktioniert aber nur, wenn die Meta-Tags wie in den Pattern aufgebaut sind ("Reighenfolge")
    <meta name="description" content="bla bla bla" />

    aber wenn andersrum, dann kein Ergebnis (wenn zuerst content= und dann name=)
    <meta content="bla bla bla" name="description" />


    auch wenn die "Reighenfolge" stimmt, finde ich das Ergebnis komisch
    bei $match1 ist das Ergebnis iin zweiten Array-Elemet ... $match1[1]
    und bei $match2 und $match3 sind die Ergebnisse jeweils im ersten Array Element [0]
    warum ???

    Die PHP-Funktion get_meta_tags() will auch nicht so richtig,
    da bekomme ich oft eine Fehlermeldung:
    failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden

    also fällt get_meta_tags() auch aus ... zu oft 403

    PS:
    ich möchte deshalb JS, um die Meta-Tags ohne Browser-Reload einlesen zu können

    ok, das ginge wohl mit CURL und einem Ajax-Request,
    aber meine Regex-Pattern sind nicht gerade optimal, wenn die "Reihenfolge" stimmen muss :(

    ... jemand ne Idee, wie man das "Reihenfolge" Problem lösen könnte,
    oder andere Vorschläge ?
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Reihenfolge: Regex anpassen. Wie das geht erkläre ich jetzt nicht.
    Anderer Vorschlag: DOM o.ä. nutzen, ist aber vermutlich die schlechtere Wahl.

    EDIT: Nun doch noch Zeit gefunden...
    <?php
    $html = <<< ETX
    <html>
            <head>
                    <title>Titel</title>
                    <meta name="keywords" content="keyword word blah" />
                    <meta name="description" content="some text" />
            </head>
    </title>
    ETX;
     
    $title = '|<title>(.*)</title>|iU';
    $meta = '#<meta (name|content)=(["\'])(.*)\\2 (name|content)=(["\'])(.*)\\5\\s*/?>#iU';
    
    preg_match_all($title, $html, $match_title);
    preg_match_all($meta, $html, $match_meta);
    
    print_r($match_title);
    print_r($match_meta);


    Beitrag zuletzt geändert: 15.7.2013 22:34:29 von hackyourlife
  6. Autor dieses Themas

    swibud

    swibud hat kostenlosen Webspace.

    vielen Dank
    ... einfach mit "ODER" ... ist ja genial :)

    für reine JS Lösung habe ich jetzt noch YQL entdeckt ... hier die YQL console

    mit dem Statement klappt es soweit
    select * from html where url="http://www.lima-city.de" and xpath="//head//title|//head/meta[@name='description']|//head//meta[@name='keywords']"


    Auf das YQL Ergebnis kann man dann auch im JSON Format zugreifen, also auch per JS auslesen.

    aber hier ist dann das Problem der Gross-/ Klein-Schreibung bei name=...
    wenn jemand
    name="Description"
    in seinem HEAD drin hat,
    dann findet YQL diesen TAG nicht ...

    gibt es bei YQL auch sowas wie einen Modifier i wie bei preg_match ??
    (also Gross-/ Klein-Schreibung ist egal)

    PS ... ahhhh, man könnte auch einfach alle <meta ... /> Tags auslesen, egal was drin steht

    YQL Statement :
    select * from html where url="http://www.lima-city.de" and xpath="//head//title|//head//meta"

    und dann im Ergebnis "selber" danach suchen, was man will (keywords/description)

    aber trotzdem die Frage, ob es in YQL sowas für "Gross-/ Klein-Schreibung ist egal" gibt ... ?
    denn es kann in HTML ja auch der Tag selber in Großbuchstaben sein ... TITLE / META

  7. g********r

    Hallo,

    Ja, du kannst den Inhalt von Meta-Tags mit Javascript auslesen.

    Es gibt im HTML-Objektmodell ein sogenanntes HTML-Elementobjekt 'meta'.
    Auf dieses Elementobjekt kann man mit Javascript zugreifen. Man bekommt
    eine Art Liste (bzw. Tabelle) der Meta-Tags der betreffenden Seite zurück
    und kann diese Liste dann nach speziellen Tags durchsuchen.

    Schau dir mal das Beispiel an in:
    http://de.selfhtml.org/javascript/objekte/anzeige/htmlelemente_meta.htm

    Dort ist eine kleine Javascript function gelistet. Wenn du auf 'Anzeigebeispiel'
    klickst, siehts du den Output dieses Programms. Ich weiß nicht, was du genau
    machen willst, aber vielleicht hilft das Beispiel ja.

    Viel Spaß.

    Beitrag zuletzt geändert: 22.7.2013 14:08:36 von geldmacher
  8. Hallo, ich habe gleich eine ähnliche Frage. Wie müsste ich es machen, wenn ich auf die Meta-Tags auf der eigenen Seite zugreifen möchte (zwingend mit JS)?
  9. Versuche mal diesen Beispielcode:
    var metas = document.getElementsByTagName("meta");
    for (var i=0; i<metas.length; i++) {
      var e = metas[i];
      if (e.hasAttribute("name") && e.hasAttribute("content")) {
        var name = e.getAttribute("name");
        var content = e.getAttribute("content");
        console.log("Meta-Tag; Name: " + name + ", Inhalt: " + content);
      }
    }
    Den kannst du dann noch anpassen, je nachdem was genau du auslesen möchtest.
  10. document.getElementsByTagName(xyz) liefert nur eine Nodelist.
    Mehr Möglichkeiten bietet eine Umwandlung der Nodelist in ein Array.
    <script>
    function checkMeta(){
    var meta = document.getElementsByTagName('meta'), // Liefert nur eine Nodelist
    n='';
    metas= [].slice.call(meta); // Umwandlung der Nodelist in ein Array
    
    metas.forEach(function(obj,i){ //beispielsweise:
    	console.log(obj.outerHTML); // Ausgabe in der Konsole
    // oder String erzeugen für die Ausgabe in einer Messagebox	
    n+=obj.outerHTML+'\n';
    // oder....oder
    }
    );
    alert(n); // Ausgabe in einer Messagebox;
    }
    window.onload = function() {checkMeta()}; // Aufruf der anonymen Funktion checkMeta()
    </script>





  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!