German (Deutsch) translation by Max Benjamin (you can also view the original English article)
Wenn Sie brauchen, um zu analysieren, HTML, reguläre Ausdrücke sind nicht der Weg zu gehen. In diesem tutorial werden Sie lernen, wie man ein open-source, leicht gelernt-parser, zu Lesen, zu ändern, und spucken Sie wieder aus HTML-Code aus externen Quellen. Mit nettuts als ein Beispiel, werden Sie lernen, wie man eine Liste von allen Artikeln auf der Website veröffentlicht und zeigen Sie Sie an.
Schritt 1. Vorbereitung
Das erste, was Sie tun müssen ist, laden Sie eine Kopie der simpleHTMLdom Bibliothek frei zur Verfügung von sourceforge.
Es gibt mehrere Dateien im download, aber das einzige, das Sie brauchen, ist die simple_html_dom.php Datei, der rest sind Beispiele und Dokumentation.

Schritt 2. Parsing-Grundlagen
Diese Bibliothek ist sehr einfach zu bedienen, aber es gibt einige Grundlagen, die Sie überprüfen sollten vor dem setzen es in die Tat umzusetzen.
Laden von HTML
1 |
$html = new simple_html_dom(); |
2 |
|
3 |
// Load from a string
|
4 |
$html->load('<html><body><p>Hello World!</p><p>We're here</p></body></html>'); |
5 |
|
6 |
// Load a file
|
7 |
$html->load_file('https://net.tutsplus.com/'); |
Sie können Ihre erste-Objekt entweder durch laden der HTML-Code aus einem string oder aus einer Datei. Laden einer Datei kann entweder über eine URL oder über Ihr lokales Dateisystem.
Eine Anmerkung von Vorsicht: Die load_file () - Methode delegiert Ihre Aufgabe in PHP file_get_contents. Wenn allow_url_fopen nicht auf true gesetzt ist in der php.ini-Datei, Sie können möglicherweise nicht zum öffnen einer remote-Datei auf diese Weise. Sie könnte fallen immer wieder auf die CURL-Bibliothek zum laden von remote-Seiten in diesem Fall, dann Lesen Sie in der load () - Methode.
Zugriff Auf Informationen

Sobald Sie Ihre DOM-Objekt, können Sie beginnen arbeiten mit, die es durch die Verwendung der find() und anlegen von Sammlungen. Eine Sammlung ist eine Gruppe von Objekten über einen Selektor - syntax ist sehr ähnlich zu jQuery.
1 |
<html>
|
2 |
<body>
|
3 |
<p>Hello World!</p> |
4 |
<p>We're Here.</p> |
5 |
</body>
|
6 |
</html>
|
In diesem Beispiel HTML, werfen wir einen Blick auf, wie der Zugang zu den Informationen im zweiten Absatz ändern Sie es und geben dann die Ergebnisse.
1 |
# create and load the HTML
|
2 |
include('simple_html_dom.php'); |
3 |
$html = new simple_html_dom(); |
4 |
$html->load("<html><body><p>Hello World!</p><p>We're here</p></body></html>"); |
5 |
|
6 |
# get an element representing the second paragraph
|
7 |
$element = $html->find("p"); |
8 |
|
9 |
# modify it
|
10 |
$element[1]->innertext .= " and we're here to stay."; |
11 |
|
12 |
# output it!
|
13 |
echo $html->save(); |
Mit der find () - Methode gibt immer eine Sammlung (array) von tags, wenn Sie angeben, dass Sie möchten, dass nur das N-te Kind, und als zweiten parameter.
Zeilen 2-4: Laden Sie die HTML-Code aus einem string, wie zuvor erläutert.
Zeile 7: Diese Zeile findet alle tags in der HTML -, und gibt Sie als ein array. Der erste Absatz wird über einen index von 0, und die nachfolgenden Absätze werden entsprechend indiziert.
Zeile 10: Diese greift auf das 2. Element in unserer Sammlung von Absätzen (index 1) und stellt eine Ergänzung zu seiner "innertext" - Attribut. Innertext stellt den Inhalt zwischen den tags, während outertext stellt den Inhalt, einschließlich der tag. Wir könnten ersetzen das tag vollständig mit outertext.
Wir fügen eine weitere Zeile ein, und ändern Sie die Klasse unserer zweiten Absatz-tag.
1 |
$element[1]->class = "class_name"; |
2 |
echo $html->save(); |
Der resultierende HTML-Code des speichern-Befehl wäre:
1 |
<html>
|
2 |
<body>
|
3 |
<p>Hello World!</p> |
4 |
<p class="class_name">We're here and we're here to stay.</p> |
5 |
</body>
|
6 |
</html>
|
Andere Selektoren
Hier sind einige andere Beispiele von Selektoren. Wenn Sie verwendet haben, jQuery, diese scheinen sehr vertraut.
1 |
# get the first occurrence of id="foo"
|
2 |
$single = $html->find('#foo', 0); |
3 |
|
4 |
# get all elements with class="foo"
|
5 |
$collection = $html->find('.foo'); |
6 |
|
7 |
# get all the anchor tags on a page
|
8 |
$collection = $html->find('a'); |
9 |
|
10 |
# get all anchor tags that are inside H1 tags
|
11 |
$collection = $html->find('h1 a'); |
12 |
|
13 |
# get all img tags with a title of 'himom'
|
14 |
$collection = $html->find('img[title=himom]'); |
Das erste Beispiel ist nicht ganz intuitiv - alle Anfragen standardmäßig Rückkehr Sammlungen, auch eine ID-Abfrage, das sollte nur ein einziges Ergebnis. Jedoch, durch die Angabe des zweiten Parameters, wir sagen "nur das erste Element dieser Sammlung".
Dies bedeutet, $single ist ein einzelnes element, dann lieber ein array von Elementen mit einem Element.
Der rest der Beispiele sind selbsterklärend.
Dokumentation
Die vollständige Dokumentation zu der Bibliothek finden Sie auf der Projekt-Dokumentation-Seite.

Schritt 3. Real-World-Beispiel
Um diese Bibliothek in action, wir gehen an, schreiben Sie eine kurze Skript zu kratzen, die Inhalte der Nettuts website, und produzieren eine Liste der Artikel, die auf der Website von Titel und Beschreibung....nur als ein Beispiel. Schaben ist ein heikler Bereich des web, und sollte nicht durchgeführt werden, ohne Erlaubnis.

1 |
include('simple_html_dom.php'); |
2 |
|
3 |
$articles = array(); |
4 |
getArticles('http://net.tutsplus.com/page/76/'); |
Wir beginnen Sie, indem Sie die Bibliothek und Aufruf der function getArticles mit der Seite möchten wir starten die Analyse. In diesem Fall sind wir, beginnend in der Nähe des Ende und freundlich zu Nettuts' server.
Wir sind auch das deklarieren einer globalen Arrays machen es ganz einfach, sammeln Sie alle Artikel-Informationen an einem Ort. Bevor wir beginnen, analysieren, werfen wir einen Blick auf, wie ein Artikel Inhaltsangabe beschrieben wird, auf Nettuts+.
1 |
<div class="preview"> |
2 |
<!-- Post Taxonomies -->
|
3 |
<div class="post_taxonomy"> ... </div> |
4 |
<!-- Post Title -->
|
5 |
<h1 class="post_title"><a>Title</a></h1> |
6 |
<!-- Post Meta -->
|
7 |
<div class="post_meta"> ... </div> |
8 |
<div class="text"><p>Description</p></div> |
9 |
</div>
|
Dies stellt eine grundlegende post-format auf der Website, einschließlich source-code Kommentare. Warum sind die Kommentare wichtig? Sie gelten als Knoten an den parser.
Schritt 4. Starten des Parsing-Funktion
1 |
function getArticles($page) { |
2 |
global $articles; |
3 |
|
4 |
$html = new simple_html_dom(); |
5 |
$html->load_file($page); |
6 |
|
7 |
// ... more ...
|
8 |
}
|
Wir beginnen ganz einfach, indem Sie behaupten, unsere Globale, die Schaffung einer neuen simple_html_dom-Objekt, lädt dann die Seite, die wir wollen, zu analysieren. Diese Funktion wird aufgerufen werden, sich später, so dass wir es einrichten, akzeptieren Sie die URL als parameter.
Schritt 5. Finden Sie die Informationen, die Wir Wollen

1 |
$items = $html->find('div[class=preview]'); |
2 |
|
3 |
foreach($items as $post) { |
4 |
# remember comments count as nodes
|
5 |
$articles[] = array($post->children(3)->outertext, |
6 |
$post->children(6)->first_child()->outertext); |
7 |
}
|
Dies ist das Fleisch der getArticles Funktion. Es geht um einen genaueren Blick nehmen, um wirklich zu verstehen, was geschieht.
Zeile 1: Erstellt ein array von Elementen - DIVS mit der Klasse "Vorschau". Wir haben jetzt eine Sammlung von Artikeln gespeichert in $items.
Zeile 5: $post bezieht sich jetzt auf einen einzelnen div-Klasse Vorschau. Wenn wir uns die original-HTML -, können wir sehen, dass das Dritte Kind ist die H1 enthält den Titel des Artikels. Das nehmen wir und ordnen Sie zu $Artikel[index][0].
Denken Sie daran, beginnen bei 0 und zählen Kommentare, wenn Sie versuchen zu bestimmen, den richtigen index des Kind-Knoten.
Zeile 6: Das sechste Kind von $post . Wir wollen die Beschreibung text aus, so schnappen wir uns das erste Kind ist outertext - das sind unter anderem die Absatz-tag. Einen einzelnen Datensatz in der Artikel sieht jetzt wie folgt aus:
1 |
$articles[0][0] = "My Article Name Here"; |
2 |
$articles[0][1] = "This is my article description" |
Schritt 6 Paginierung
Das erste, was wir tun, ist zu bestimmen, wie finden Sie unsere nächsten Seite. Auf Nettuts+ werden die URLs sind einfach herauszufinden, aber wir behaupten, Sie nicht sind, und sich den nächsten link über das Parsen.

Wenn wir uns die HTML -, sehen wir Folgendes:
1 |
<a href="http://net.tutsplus.com/page/2/" class="nextpostslink">»</a> |
Wenn es eine nächste Seite (und es wird nicht immer sein), finden wir einen Anker mit der Klasse von 'nextpostslink'. Nun, dass Informationen verwendet werden können.
1 |
if($next = $html->find('a[class=nextpostslink]', 0)) { |
2 |
$URL = $next->href; |
3 |
|
4 |
$html->clear(); |
5 |
unset($html); |
6 |
|
7 |
getArticles($URL); |
8 |
}
|
In der ersten Zeile sehen wir, wenn wir finden ein Anker mit der Klasse nextpostslink. Beachte besonders den zweiten parameter für die find(). Dieser gibt an, wollen wir nur das erste element (index 0) der gefundenen Sammlung zurückgegeben. $nächste wird nur mit einem einzigen element, sondern als eine Gruppe von Elementen.
Als Nächstes weisen wir dem link die HREF der Variablen $URL. Dies ist wichtig, weil wir dabei sind, zu zerstören, das HTML-Objekt. Durch eine php5 zirkuläre Verweise Speicherverlust, der aktuelle simple_html_dom-Objekt gelöscht werden müssen und gelöscht, bevor ein weiterer angelegt. Andernfalls könnte es dazu führen, Sie zu Essen, bis alle Ihre verfügbaren Speicher.
Schließlich rufen wir getArticles mit der URL der nächsten Seite. Diese Rekursion endet, wenn es keine weiteren Seiten zu analysieren.
Schritt 7 Ausgabe der Ergebnisse
Zuerst gehen wir zum einrichten ein paar grundlegende stylings. Das ist völlig willkürlich - Sie können Ihre Ausgabe Aussehen, wie Sie wollen.

1 |
#main {
|
2 |
margin:80px auto; |
3 |
width:500px; |
4 |
} |
5 |
h1 {
|
6 |
font:bold 40px/38px helvetica, verdana, sans-serif; |
7 |
margin:0; |
8 |
} |
9 |
h1 a {
|
10 |
color:#600; |
11 |
text-decoration:none; |
12 |
} |
13 |
p {
|
14 |
background: #ECECEC; |
15 |
font:10px/14px verdana, sans-serif; |
16 |
margin:8px 0 15px; |
17 |
border: 1px #CCC solid; |
18 |
padding: 15px; |
19 |
} |
20 |
.item {
|
21 |
padding:10px; |
22 |
} |
Weiter, wir werden noch ein kleines bisschen PHP in die Seite, um die Ausgabe der zuvor gespeicherten Informationen.
1 |
<?php
|
2 |
foreach($articles as $item) { |
3 |
echo "<div class='item'>"; |
4 |
echo $item[0]; |
5 |
echo $item[1]; |
6 |
echo "</div>"; |
7 |
}
|
8 |
?>
|
Das Endergebnis ist eine einzelne HTML-Seite mit einer Liste alle Artikel, beginnend auf der Seite, angegeben durch das erste getArticles () - Aufruf.
Schritt 8 Abschluss
Wenn Sie analysieren eine große Menge von Seiten zu sagen, die gesamte Website), kann es länger dauern, dann ist die max execution time erlaubt, die von Ihrem server. Zum Beispiel, läuft aus meiner lokalen Maschine dauert es etwa eine Sekunde pro Seite (einschließlich der Zeit, die zu Holen).
Auf einer Website wie Nettuts, mit einem aktuellen, 78 Seiten, tutorials, dies würde, laufen Sie über eine minute.
Dieses tutorial soll Ihnen den Einstieg mit HTML-parsing. Es gibt andere Methoden, um die Arbeit mit dem DOM, einschließlich PHP-built-in, das Ihnen die Arbeit mit leistungsstarken xpath-Selektoren für die Elemente. Für die einfache und schnelle Handhabung beginnt, finde ich diese library zu einem der besten. Schließen Hinweis, immer daran denken, die Genehmigung zu erhalten, bevor das Schaben einer Website; dies ist wichtig. Vielen Dank für das Lesen!



