Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Analysieren von HTML mit PHP mit DiDOM

Read Time: 8 mins

German (Deutsch) translation by Ines Willenbrock (you can also view the original English article)

Hin und wieder müssen Entwickler Webseiten kratzen, um Informationen von einer Website zu erhalten. Nehmen wir zum Beispiel an, Sie arbeiten an einem persönlichen Projekt, bei dem Sie geografische Informationen über die Hauptstädte verschiedener Länder von Wikipedia erhalten müssen. Die manuelle Eingabe würde viel Zeit in Anspruch nehmen. Sie können es jedoch sehr schnell tun, indem Sie die Wikipedia-Seite mit Hilfe von PHP scrapen. Sie können auch den HTML-Code automatisch analysieren, um bestimmte Informationen zu erhalten, anstatt das gesamte Markup manuell durchzugehen.

In diesem Tutorial lernen wir einen schnellen, benutzerfreundlichen HTML-Parser namens DiDOM kennen. Wir beginnen mit dem Installationsprozess und lernen dann, wie man Informationen aus verschiedenen Elementen auf einer Webseite mit verschiedenen Arten von Selektoren wie Tags, Klassen usw. extrahiert.

Installation und Nutzung

Sie können DiDOM ganz einfach in Ihrem Projektverzeichnis installieren, indem Sie den folgenden Befehl ausführen:

Sobald Sie den obigen Befehl ausgeführt haben, können Sie HTML aus einer Zeichenfolge, einer lokalen Datei oder einer Webseite laden. Hier ist ein Beispiel:

Wenn Sie sich entscheiden, HTML aus einem Dokument zu analysieren, kann es bereits geladen und in einer Variablen gespeichert werden. In solchen Fällen können Sie diese Variable einfach an Document() übergeben, und DiDOM bereitet die Zeichenfolge für die Analyse vor.

Wenn der HTML-Code aus einer Datei oder einer URL geladen werden muss, können Sie diesen als ersten Parameter an Document() übergeben und den zweiten Parameter auf true setzen.

Sie können auch ein neues Document-Objekt erstellen, indem Sie das neue Document() ohne Parameter verwenden. In diesem Fall können Sie die Methode loadHtml() aufrufen, um HTML aus einer Zeichenfolge zu laden, und loadHtmlFile(), um HTML aus einer Datei oder Webseite zu laden.

Suchen von HTML-Elementen

Das erste, was Sie tun müssen, bevor Sie den HTML-Code oder Text von einem Element erhalten, ist das Element selbst zu finden. Der einfachste Weg, dies zu tun, besteht darin, einfach die find()-Methode zu verwenden und den CSS-Selektor für das beabsichtigte Element als ersten Parameter zu übergeben.

Sie können den XPath für ein Element auch als ersten Parameter der find()-Methode übergeben. Dazu müssen Sie jedoch Query::TYPE_XPATH als zweiten Parameter übergeben.

Wenn Sie nur XPath-Werte zum Suchen eines HTML-Elements verwenden möchten, können Sie einfach die xpath()-Methode verwenden, anstatt jedes Mal Query::TYPE_XPATH als zweiten Parameter für find() zu übergeben.

Wenn DiDOM Elemente finden kann, die dem übergebenen CSS-Selektor oder XPATH-Ausdruck entsprechen, gibt es ein Array von Instanzen von DiDom\Element zurück. Wenn keine solchen Elemente gefunden werden, wird ein leeres Array zurückgegeben.

Da diese Methoden ein Array zurückgeben, können Sie mithilfe von find()[n-1] direkt auf das n-ten übereinstimmende Element zugreifen.

Ein Beispiel

Im folgenden Beispiel erhalten wir den inneren HTML-Code aus allen Überschriften der ersten und zweiten Ebene im Wikipedia-Artikel über Washington, D.C.

Wir beginnen mit dem Erstellen eines neuen Document-Objekts, indem wir die URL des Wikipedia-Artikels über Washington, D.C übergeben. Danach erhalten wir das Hauptüberschriftenelement mit der find()-Methode und speichern es in einer Variablen namens $main_heading. Wir werden nun in der Lage sein, verschiedene Methoden für dieses Element wie text(), innerHtml(), html() usw. aufzurufen.

Für die Hauptüberschrift rufen wir einfach die html()-Methode auf, die den HTML-Code des gesamten heading-Elements zurückgibt. In ähnlicher Weise können wir den HTML-Code in einem bestimmten Element abrufen, indem wir die innerHtml()-Methode verwenden. Manchmal interessieren Sie sich mehr für den Nur-Text-Inhalt eines Elements als für seinen HTML-Code. In solchen Fällen können Sie einfach die text()-Methode verwenden und damit fertig sein.

Die Überschriften der zweiten Ebene unterteilen unsere Wikipedia-Seite in klar definierte Abschnitte. Möglicherweise möchten Sie jedoch einige dieser Unterüberschriften wie "Siehe auch", "Notizen" usw. entfernen.

Eine Möglichkeit, dies zu tun, besteht darin, alle Überschriften der zweiten Ebene zu durchlaufen und den von der text()-Methode zurückgegebenen Wert zu überprüfen. Wir brechen aus der Schleife aus, wenn der zurückgegebene Überschriftentext "Siehe auch" lautet.

Sie können direkt zur Überschrift der 4. oder 6. Ebene zwei gelangen, indem Sie $document->find('h2')[3] bzw. $document->find('h2')[5] verwenden.

Durchlaufen des DOM nach oben und unten

Sobald Sie Zugriff auf ein bestimmtes Element haben, können Sie mit der Bibliothek die DOM-Struktur auf und ab durchlaufen, um problemlos auf andere Elemente zuzugreifen.

Sie können mit der parent()-Methode zum übergeordneten Element eines HTML-Elements wechseln. Ebenso können Sie mit den Methoden nextSibling() und previousSibling() zum nächsten oder vorherigen gleichgeordneten Element gelangen.

Es stehen viele Methoden zur Verfügung, um auch Zugriff auf die untergeordneten Elemente eines DOM-Elements zu erhalten. Beispielsweise können Sie mit der child(n)-Methode zu einem bestimmten untergeordneten Element gelangen. Ebenso können Sie mithilfe der Methoden firstChild() und lastChild() zugriffen auf das erste oder letzte untergeordnete Element eines bestimmten Elements erhalten. Sie können alle untergeordneten Elemente eines bestimmten DOM-Elements mit der children()-Methode durchlaufen.

Sobald Sie zu einem bestimmten Element gelangen, können Sie mit den Methoden html(), innerHtml() und text() auf dessen HTML usw. zugreifen.

Im folgenden Beispiel beginnen wir mit Überschriftenelementen der zweiten Ebene und überprüfen weiterhin, ob das nächste gleichgeordnete Element Text enthält. Sobald wir ein Geschwisterelement mit etwas Text finden, geben wir es an den Browser aus.

Sie können eine ähnliche Technik verwenden, um alle gleichgeordneten Elemente zu durchlaufen und den Text nur auszugeben, wenn er eine bestimmte Zeichenfolge enthält oder wenn das gleichgeordnete Element ein Absatz-Tag ist usw. Sobald Sie die Grundlagen kennen, ist es einfach, die richtigen Informationen zu finden.

Bearbeiten von Elementattributen

Die Möglichkeit, den Attributwert für verschiedene Elemente abzustellen oder festzulegen, kann sich in bestimmten Situationen als sehr nützlich erweisen. Zum Beispiel können wir den Wert des src-Attributs für alle img-Tags in unserem Wikipedia-Artikel abrufen, indem wir $image_elem->attr('src') verwenden. Auf ähnliche Weise können Sie den Wert von href-Attributen für alle a-Tags in einem Dokument abrufen.

Es gibt drei Möglichkeiten, den Wert eines bestimmten Attributs für ein HTML-Element abzustellen. Sie können die getAttribute('attrName')-Methode verwenden und den Namen des Attributs, an dem Sie interessiert sind, als Parameter übergeben. Sie können auch die attr('attrName')-Methode verwenden, die genau wie getAttribute() funktioniert. Schließlich können Sie mit der Bibliothek auch den Attributwert direkt mithilfe von $elem->attrName abrufen. Dies bedeutet, dass Sie den Wert des src-Attributs für ein image-Element direkt mithilfe von $imageElem->src abrufen können.

Sobald Sie Zugriff auf die src-Attribute haben, können Sie den Code schreiben, um automatisch alle Bilddateien herunterzuladen. Auf diese Weise können Sie viel Zeit sparen.

Sie können den Wert eines bestimmten Attributs auch mithilfe von drei verschiedenen Techniken festlegen. Zunächst können Sie die setAttribute('attrName', 'attrValue')-Methode verwenden, um den Attributwert festzulegen. Sie können auch die attr('attrName', 'attrValue')-Methode verwenden, um den Attributwert festzulegen. Schließlich können Sie den Attributwert für ein bestimmtes Element mit $Elem->attrName = 'attrValue' festlegen.

Hinzufügen, Entfernen und Ersetzen von Elementen

Sie können auch Änderungen am geladenen HTML-Dokument mit verschiedenen von der Bibliothek bereitgestellten Methoden vornehmen. Beispielsweise können Sie Elemente aus der DOM-Struktur mithilfe der Methoden appendChild(), replace() und remove() hinzufügen, ersetzen oder entfernen.

Die Bibliothek ermöglicht es Ihnen auch, Ihre eigenen HTML-Elemente zu erstellen, um sie an das ursprüngliche HTML-Dokument anzuhängen. Sie können ein neues Element-Objekt erstellen, indem Sie das newElement('tagName', 'tagContent') verwenden.

Denken Sie daran, dass Sie einen Uncaught Error: Class 'Element' not found Fehler erhalten, wenn Ihr Programm nicht die Zeile use DiDom\Element enthält, bevor Sie das Elementobjekt instanziieren.

Sobald Sie das Element haben, können Sie es entweder mit der appendChild()-Methode an andere Elemente im DOM anhängen oder die replace()-Methode verwenden, um das neu instanziierte Element als Ersatz für ein altes HTML-Element im Dokument zu verwenden. Das folgende Beispiel soll bei der weiteren Klärung dieses Konzepts helfen.

Zunächst gibt es in unserem Dokument kein h2-Element mit der Klasse test-heading. Daher erhalten wir immer wieder einen Fehler, wenn wir versuchen, auf ein solches Element zuzugreifen.

Nachdem wir überprüft haben, ob kein solches Element vorhanden ist, erstellen wir ein neues h2-Element und ändern den Wert seines Klassenattributs in test-heading.

Danach ersetzen wir das erste h1-Element im Dokument durch unser neu erstelltes h2-Element. Wenn Sie die find()-Methode in unserem Dokument erneut verwenden, um die h2-Überschrift mit der Klasse test-heading zu finden, wird jetzt ein Element zurückgegeben.

Abschließende Gedanken

In diesem Tutorial wurden die Grundlagen des PHP DiDOM HTML-Parsers behandelt. Wir begannen mit der Installation und lernten dann, wie man HTML aus einer Zeichenfolge, Datei oder URL lädt. Danach haben wir besprochen, wie man ein bestimmtes Element basierend auf seinem CSS-Selektor oder XPath findet. Wir haben auch gelernt, wie man die Geschwister, Eltern oder Kinder eines Elements bekommt. In den restlichen Abschnitten wurde beschrieben, wie wir die Attribute eines bestimmten Elements bearbeiten oder Elemente in einem HTML-Dokument hinzufügen, entfernen und ersetzen können.

Wenn es etwas gibt, das ich im Tutorial klären soll, lassen Sie es mich gerne in den Kommentaren wissen.

Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.