Seitentitel holen
Themm
- programmiertechnik
0 niklaskamenisch0 Themm0 niklaskamenisch0 Themm0 Themm
0 Matthias Apsel
2 Jeena Paradies
Hi euch allen :D,
ich wusste nicht, ob ich diese Post dem Themenbereich HTML, HTTP oder PHP zu ordnen sollte - deshalb PROGRAMMIERTECHNIK. ;)
Mein Problem:
Ich möchte den Seitentitel der URL herausfinden. Die URL ist nicht festgelegt, sondern eine Variabeln. - Ich hoffe hiermit ist alles Wicchtige gesagt. :)
hi,
der titel der seite steht im entsprechenden HTML-Tag im head der Seite.
JS kann das z.b. über getElementsByName auslesen
PHP erzeugt HTML und beides weiß somit eigentlich schon den eigenen Titel ;)
Wenn du auf eine andere Seite schauen möchtest, dann z.b. mit php den quelltext auslesen und z.b. als xml verarbeitet auf das titel-tag zugreifen.
(Geht glaub ich bei per JS veränderten Titeln nicht, da js nicht ausgeführt wird beim PHP-Aufruf)
Ich hoffe du kannst meiner Antwort entnehmen, dass es zu wenig Infos waren =P
Gruß Niklas
Ich hoffe du kannst meiner Antwort entnehmen, dass es zu wenig Infos waren =P
Ja, also ich habe eine Variabel $url
. Diese Variabel enthält die URL z.B. www.example.com . Nun möchte ich mit einer Funktion den Titel (<titel>Hier gesuchter Titel.</titel>
) der Webseite zurückbekommen.
Gruß Niklas
Einen freundlichen Gruß zurück. :-)
hi,
Ich hoffe du kannst meiner Antwort entnehmen, dass es zu wenig Infos waren =P
Ja, also ich habe eine Variabel
$url
. Diese Variabel enthält die URL z.B. www.example.com . Nun möchte ich mit einer Funktion den Titel (<titel>Hier gesuchter Titel.</titel>
) der Webseite zurückbekommen.
Also von einer externen webseite!?
Dann wie beschrieben, einfach die Seite einlesen (z.b. als XML oder simpel als String) und dann durchsuchen lassen. Bei einem String z.b. per Regex.
Es kann natürlich immer Seiten geben, bei denen du den Titel nicht lesen kannst auf diese Weise. Manch stümpercms (von kleinen Firmen) setzt den Seitentitel nachträglich per JS. Das würde also daneben gehen ...
So als Funktionsidee: readfile ('');
Viel Spaß beim Basteln
Schönes Wochenende!
Also von einer externen webseite!?
Ja.
Theoretisch könnte man mit http_head($url) einen String zurückkriegen. Wie könnte man diesen String so verarbeiten das der Text nach <title>
und vor </title>
ausgegeben wird?
hi,
eine möglichkeit wäre <titel> suchen und bis dort wegschneiden, dann noch mal nach </titel> suchen und bis dort alles nehmen.
Regex wäre aber schöner. Da bin ich aber nicht geübt genug ;)
Gruß Niklas
@@niklaskamenisch:
nuqneH
eine möglichkeit wäre <titel> suchen
Im Allgemeinen ist das keine Möglichkeit, da '<title>' im Quelltext nicht unbedingt vorkommt.
Qapla'
Hallo,
Im Allgemeinen ist das keine Möglichkeit, da '<title>' im Quelltext nicht unbedingt vorkommt.
Hm, wie meinst du das? Ist <title> nicht eines der wenigen Elemente die bei einem HTML-Dokument wirklich auch vorgeschrieben sind?
Jeena
Om nah hoo pez nyeetz, Jeena Paradies!
Im Allgemeinen ist das keine Möglichkeit, da '<title>' im Quelltext nicht unbedingt vorkommt.
Hm, wie meinst du das? Ist <title> nicht eines der wenigen Elemente die bei einem HTML-Dokument wirklich auch vorgeschrieben sind?
oh oh: Änderung des Zitats!
in Niklas' Posting war ein Tipfelher. Da hieß es <titel>.
Matthias
Hallo,
oh oh: Änderung des Zitats!
Ah hehe ok, dabei hat Gunnar das sogar noch in Zitationszeichen reingemacht, da habe ich auf den Orginaltext gar nicht mehr geschaut.
Jeena
@@Matthias Apsel:
nuqneH
in Niklas' Posting war ein Tipfelher. Da hieß es <titel>.
Das war mir entgangen.
Was ich meinte: Zwischen '<title' und '>' darf Whitespace stehen. Und Attribute.
Qapla'
Hallo,
Was ich meinte: Zwischen '<title' und '>' darf Whitespace stehen. Und Attribute.
Ah, guter Einwand, daran habe ich bei meiner Lösung auch nicht gedacht.
Jeena
@@Jeena Paradies:
nuqneH
Was ich meinte: Zwischen '<title' und '>' darf Whitespace stehen. Und Attribute.
Ah, guter Einwand, daran habe ich bei meiner Lösung auch nicht gedacht.
Und wenn du jetzt mit <title[^>]*>
kommst, schmetter ich die <title id="a>">
entgegen.
Qapla'
Hallo,
Und wenn du jetzt mit
<title[^>]*>
kommst, schmetter ich die<title id="a>">
entgegen.
Hehe scheiße!
Naja gut, ich glaube beim überwiegendem Teil von Webseiten wird das aber dann dennoch funktionieren, und bevor man den Regex noch komplizierter zu machen versucht ist es wohl sinnvoller gleich einen DOM-Parser zu benutzen.
Jeena
@@Jeena Paradies:
nuqneH
Naja gut, ich glaube beim überwiegendem Teil von Webseiten wird das aber dann dennoch funktionieren
Das Problem ist, dass die eigene Seite nicht funktioniert, wenn auf der fremden Seite das Markup nicht so ist, wie man’s gern hätte.
Das Script muss schon so robust sein, dass es mit allem klarkommt, was da so kommen kann.
Qapla'
Hallo,
Das Problem ist, dass die eigene Seite nicht funktioniert, wenn auf der fremden Seite das Markup nicht so ist, wie man’s gern hätte.
Naja, nicht ganz, sie verhält sich so als ob die fremde Seite kein title-Element hätte (obwohl sie eines hat). Man kann das natürlich als "nicht funktionieren" definieren, aber ich würde das nicht in jedem Fall tun, kommt drauf an was die Hauptaufgabe meiner Seite ist.
Jeena
@@Gunnar Bittersmann:
nuqneH
Und wenn du jetzt mit
<title[^>]*>
kommst,
Jetzt hat er’s doch getan … ;-)
Qapla'
Om nah hoo pez nyeetz, Jeena Paradies!
Was ich meinte: Zwischen '<title' und '>' darf Whitespace stehen. Und Attribute.
Ah, guter Einwand, daran habe ich bei meiner Lösung auch nicht gedacht.
Für welche sinnvollen Anwendungsmöglichkeiten muss das title-Element Attribute besitzen?
Matthias
@@Matthias Apsel:
nuqneH
Für welche sinnvollen Anwendungsmöglichkeiten muss das title-Element Attribute besitzen?
Das ist nicht die Frage. Es kann welche haben. Und man hat keinen Einfluss drauf, ob es welche hat. Hier entlang …
Qapla'
Hallo,
Für welche sinnvollen Anwendungsmöglichkeiten muss das title-Element Attribute besitzen?
Mir fallen da sofort die "data-"-Attribute ein.
Jeena
@@Matthias Apsel:
nuqneH
Für welche sinnvollen Anwendungsmöglichkeiten muss das title-Element Attribute besitzen?
Mir fiele da @lang ein, wenn der Seitentitel in einer anderen Sprache als der Seiteninhalt ist (komplett anders, sonst geht's nicht).
Qapla'
Theoretisch könnte man mit http_head($url) einen String zurückkriegen. Wie könnte man diesen String so verarbeiten das der Text nach
<title>
und vor</title>
ausgegeben wird?
Du verwechselst da das HTML-Head-Element mit dem HTTP-Header. Und darin wirst du den Titel nicht finden. http_head ist für dich also nutzlos - du kannst stattdessen aber http_get benutzen. Die Antwort kannst du dann zum Beispiel mit der DOM-Api weiterverarbeiten.
Om nah hoo pez nyeetz, niklaskamenisch!
der titel der seite steht im entsprechenden HTML-Tag im head der Seite.
Element, nicht Tag.
JS kann das z.b. über getElementsByName auslesen
Das Title-Element darf kein Name-Attribut haben, du meinst sicher getElementsByTagName.
Matthias
hi,
Das Title-Element darf kein Name-Attribut haben, du meinst sicher getElementsByTagName.
Ja natürlich das xD sorry, war wohl doch etwas spät gestern ...
Danke für die korrektur!
Matthias
Gruß Niklas
Hallo,
Ich möchte den Seitentitel der URL herausfinden. Die URL ist nicht festgelegt, sondern eine Variabeln. - Ich hoffe hiermit ist alles Wicchtige gesagt. :)
<?php
$url = "http://google.com";
// Die 9000 sind dazu da um nach 9000 Zeichen das runterladen abzubrechen
// wenn bis dahin noch kein title gefunden wird dann ist es eher unwahrscheinlich
// dass da überhaupt einer ist.
$str = file_get_contents($url, false, NULL, 0, 9000);
preg_match("#<title>(.*?)</title>#", $str, $r);
if(isset($r[1])) {
echo $r[1]; // Titel wird ausgegeben
} else {
echo "no title found";
}
Jeena
@@Jeena Paradies:
nuqneH
preg_match("#<title>(.*?)</title>#", $str, $r);
Qapla'
Hallo,
preg_match("#<title>(.*?)</title>#", $str, $r);
Nein.
Guter Einwand. Vielleicht mit einer kleinen Anpassung?
preg_match("#<title[^>]*>(.*?)</title>#", $str, $r);
Jeena
@@Jeena Paradies:
nuqneH
preg_match("#<title>(.*?)</title>#", $str, $r);
Nein.
Guter Einwand. Vielleicht mit einer kleinen Anpassung?
preg_match("#<title[^>]*>(.*?)</title>#", $str, $r);
Nein. Die Anpassung ist zu klein.
Mir regulärem Ausdruck wird’s zu kompliziert (wenn’s überhaupt geht). Ein Parser wäre wohl Mittel der Wahl.
Qapla'
Hallo,
Nein. Die Anpassung ist zu klein.
Mir regulärem Ausdruck wird’s zu kompliziert (wenn’s überhaupt geht). Ein Parser wäre wohl Mittel der Wahl.
Jup denke ich auch. Kommt wohl drauf an wie wichtig es einem ist auch die ungewöhnlicheren Fälle mit zu berücksichtigen, die nicht so oft vorkommen. Wenn es ausreicht dass es bei 99% der Fälle funktioniert dann kann man auch mit dem regex leben.
Jeena
Om nah hoo pez nyeetz, Jeena Paradies!
Jup denke ich auch. Kommt wohl drauf an wie wichtig es einem ist auch die ungewöhnlicheren Fälle mit zu berücksichtigen, die nicht so oft vorkommen. Wenn es ausreicht dass es bei 99% der Fälle funktioniert dann kann man auch mit dem regex leben.
0. Was ich denke, ist bedeutungslos.
1. Ich denke, dass es wesentlich mehr websiten ohne title-Element gibt als solche, deren title-Element Attribute hat.
2. preg_match("#<title(.*?)</title>#", $str, $r); und aus $r[1] das erste Zeichen entfernen, findet dieselben Seiten wie dein erster Entwurf. Bei den anderen ist der Titel wenigstens Teilmenge des Suchergebnisses.
Matthias
Tach!
- Ich denke, dass es wesentlich mehr websiten ohne title-Element gibt als solche, deren title-Element Attribute hat.
1.a) Die Wahrscheinlichkeit, dass title-Elemente in mehr als einer Zeile notiert sind, dürfte auch höher sein, als welche mit Attributen. Der Regexp sollte also wenigstens Mehrzeiligkeit berücksichtigen. Das bekommt man recht billig mit einem angehängten s nach dem hinteren Delimiter.
dedlfix.
Hello,
was mich wirklich wundert ist, dass PHP noch keinen HTML-Parser als festen Bestandteil enthält.
Und je öfter hier derartige Postings mit "das geht aber so nicht" beantwortet werden, steigt bei mir der Eindruck, dass (x)HTML eine Geheimwissenschaft ist (bleiben soll). Wie man Seiten wieder auseinadernimmt, dürfen nur die Browser (noch nichtmal deren Hersteller *g*) und Google wissen. Denn sonst würde ja die Welt stehenbleiben.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
Und je öfter hier derartige Postings mit "das geht aber so nicht" beantwortet werden, steigt bei mir der Eindruck, dass (x)HTML eine Geheimwissenschaft ist (bleiben soll). Wie man Seiten wieder auseinadernimmt, dürfen nur die Browser (noch nichtmal deren Hersteller *g*) und Google wissen. Denn sonst würde ja die Welt stehenbleiben.
Hm, ich nahm einfach an dass die Antwort "geht mit einem HTML-Parser" ausreichen würde damit man sich dann einfach einen Sucht und in die Doku schaut wie man ihn benutzt. Aber gut ich poste mal hier den code:
<?php
$url = "http://google.com";
$html_str = file_get_contents($url);
$doc = new DOMDocument();
$doc->loadHTML($html_str);
$titles = $doc->getElementsByTagName("title");
if($titles->length > 0) {
$title = $titles->item(0);
echo $title->textContent;
} else {
echo "no title element found";
}
Jeena
Hello,
Hm, ich nahm einfach an dass die Antwort "geht mit einem HTML-Parser" ausreichen würde damit man sich dann einfach einen Sucht und in die Doku schaut wie man ihn benutzt. Aber gut ich poste mal hier den code:
Das ist wirklich lieb von Dir :-)
<?php
$url = "http://google.com";
$html_str = file_get_contents($url);$doc = new DOMDocument();
$doc->loadHTML($html_str);
$titles = $doc->getElementsByTagName("title");if($titles->length > 0) {
$title = $titles->item(0);
echo $title->textContent;
} else {
echo "no title element found";
}
Und wenn Du jetzt noch verlinken könntest, mit welcher HTML-Parser-Klasse Du das ausprobiert hast, dann würde ich dem Thread drei Sternchen geben für gute gegeseitige Unterstützung bei Web-Entwicklern und zielführende Behandlung der Aufgabenstellung aus dem O-Post.
\*cheese\*
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
مرحبا
Und wenn Du jetzt noch verlinken könntest, mit welcher HTML-Parser-Klasse Du das ausprobiert hast, dann würde ich dem Thread drei Sternchen geben
http://php.net/manual/de/class.domdocument.php, und DOMDocument::getElementsByTagName (sehr schön, kannte ich alles noch garnicht)
Und jetzt her mit den Sternchen ;)
mfg
Hallo,
Hm, ich nahm einfach an dass die Antwort "geht mit einem HTML-Parser" ausreichen würde damit man sich dann einfach einen Sucht und in die Doku schaut wie man ihn benutzt. Aber gut ich poste mal hier den code:
Und wenn Du jetzt noch verlinken könntest, mit welcher HTML-Parser-Klasse Du das ausprobiert hast, dann würde ich dem Thread drei Sternchen geben für gute gegeseitige Unterstützung bei Web-Entwicklern und zielführende Behandlung der Aufgabenstellung aus dem O-Post.
Malcom hat das jetzt noch mal ein bisschen aufgedröselt aber der Link war schon drin, vielleicht etwas versteckt hinter dem Wörtchen Doku :)
Jeena
Hello Jeena,
Malcom hat das jetzt noch mal ein bisschen aufgedröselt aber der Link war schon drin, vielleicht etwas versteckt hinter dem Wörtchen Doku :)
Danke für die Mitwirkung. Den Link habe ich nicht gesehen. Könnte also einem Nachleser dann erst recht passieren :-O
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg