Frage Wie parst und verarbeitest du HTML / XML in PHP?


Wie kann man HTML / XML analysieren und daraus Informationen extrahieren?


1894
2017-08-26 17:19


Ursprung


Antworten:


Native XML-Erweiterungen

Ich bevorzuge einen der native XML-Erweiterungen Da sie mit PHP geliefert werden, sind sie in der Regel schneller als alle Drittanbieter-Bibliotheken und geben mir die Kontrolle, die ich über das Markup benötige.

DOM

Mit der DOM-Erweiterung können Sie XML-Dokumente über die DOM-API mit PHP 5 bearbeiten. Es ist eine Implementierung des W3C Document Object Model Core Level 3, einer plattform- und sprachneutralen Schnittstelle, über die Programme und Skripte dynamisch zugreifen und aktualisieren können Inhalt, Struktur und Stil der Dokumente.

DOM ist in der Lage, reales (gebrochenes) HTML zu analysieren und zu modifizieren und es kann XPath-Abfragen. Es basiert auf libxml.

Es braucht einige Zeit, um mit DOM produktiv zu werden, aber diese Zeit ist es wert IMO. Da DOM eine sprachunabhängige Schnittstelle ist, finden Sie Implementierungen in vielen Sprachen. Wenn Sie also Ihre Programmiersprache ändern müssen, werden Sie wahrscheinlich schon wissen, wie Sie die DOM-API dieser Sprache verwenden.

Ein grundlegendes Anwendungsbeispiel finden Sie in Ergreifen Sie das href-Attribut eines A-Elements und eine allgemeine konzeptionelle Übersicht finden Sie unter DOMDokument in PHP

Die Verwendung der DOM-Erweiterung wurde ausführlich in StackOverflow behandeltWenn Sie sich entscheiden, es zu verwenden, können Sie sicher sein, dass die meisten der Probleme, mit denen Sie konfrontiert werden, durch Suchen / Durchsuchen von Stack Overflow gelöst werden können.

XMLReader

Die XMLReader-Erweiterung ist ein XML-Pull-Parser. Der Leser agiert als ein Cursor, der auf dem Dokumentenstrom vorwärts geht und an jedem Knoten auf dem Weg anhält.

XMLReader basiert wie DOM auf libxml. Ich bin mir nicht bewusst, wie das HTML-Parser-Modul ausgelöst wird. Daher ist die Verwendung von XMLReader zum Analysieren von fehlerhaftem HTML möglicherweise weniger robust als das Verwenden von DOM, wo Sie explizit angeben können, dass das HTML-Parser-Modul von libxml verwendet werden soll.

Ein grundlegendes Anwendungsbeispiel finden Sie unter Erhalten aller Werte von h1 Tags mit PHP

XML-Parser

Mit dieser Erweiterung können Sie XML-Parser erstellen und anschließend Handler für verschiedene XML-Ereignisse definieren. Jeder XML-Parser hat auch einige Parameter, die Sie anpassen können.

Die XML-Parser-Bibliothek basiert ebenfalls auf libxml und implementiert ein SAXOPHON Stil XML-Push-Parser. Es ist möglicherweise eine bessere Wahl für die Speicherverwaltung als DOM oder SimpleXML, aber es wird schwieriger sein mit zu arbeiten als der Pull-Parser, der von XMLReader implementiert wird.

EinfachesXml

Die SimpleXML-Erweiterung bietet ein sehr einfaches und einfach zu verwendendes Toolset zum Konvertieren von XML in ein Objekt, das mit normalen Eigenschaftenselektoren und Array-Iteratoren verarbeitet werden kann.

SimpleXML ist eine Option, wenn Sie wissen, dass der HTML-Code XHTML ist. Wenn Sie zerbrochenes HTML analysieren müssen, denken Sie nicht einmal an SimpleXml, da es sich ersticken wird.

Ein grundlegendes Anwendungsbeispiel finden Sie unter Ein einfaches Programm für CRUD-Knoten und Knotenwerte der XML-Datei und da ist viele zusätzliche Beispiele im PHP Manual.


Bibliotheken von Drittanbietern (libxml-basiert)

Wenn Sie eine Libelle von Drittanbietern bevorzugen, würde ich vorschlagen, eine Lib zu verwenden, die tatsächlich verwendet wird DOM/libxml Darunter statt String-Parsing.

FluentDom

FluentDOM bietet eine jQuery-ähnliche fließende XML-Schnittstelle für das DOMDocument in PHP. Selektoren werden in XPath oder CSS (mit einem CSS zu XPath-Konverter) geschrieben. Aktuelle Versionen erweitern das DOM, das Standardschnittstellen implementiert, und fügen Features aus dem DOM Living Standard hinzu. FluentDOM kann Formate wie JSON, CSV, JsonML, RabbitFish und andere laden. Kann über Composer installiert werden.

HtmlPageDom

Wa72 \ HtmlPageDom` ist eine PHP-Bibliothek zur einfachen Manipulation von HTML   Dokumente verwenden es erfordert DomCrawler von Symfony2   Komponenten zum Durchfahren der   DOM-Baum und erweitert es durch Hinzufügen von Methoden zum Bearbeiten des DOM   Baum von HTML-Dokumenten.

phpQuery (nicht seit Jahren aktualisiert)

phpQuery ist eine serverseitige, verkettete CSS3-Selektor-gesteuerte Document Object Model (DOM) -API, die auf der in PHP5 geschriebenen jQuery-JavaScript-Bibliothek basiert und eine zusätzliche Befehlszeilenschnittstelle (CLI) bereitstellt.

Siehe auch: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom bietet Tools zum Arbeiten mit DOM-Dokumenten und -Strukturen. Derzeit bieten wir Zend_Dom_Query an, das eine einheitliche Oberfläche für die Abfrage von DOM-Dokumenten unter Verwendung von XPath- und CSS-Selektoren bietet.

QueryPfad

QueryPath ist eine PHP-Bibliothek zum Bearbeiten von XML und HTML. Es wurde entwickelt, um nicht nur mit lokalen Dateien, sondern auch mit Webdiensten und Datenbankressourcen zu arbeiten. Es implementiert einen Großteil der jQuery-Schnittstelle (einschließlich CSS-Selektoren), ist jedoch stark auf die serverseitige Verwendung abgestimmt. Kann über Composer installiert werden.

fDOMDokument

fDOMDocument erweitert das Standard-DOM, um Ausnahmen anstelle von PHP-Warnungen oder Hinweisen bei Fehlern zu verwenden. Sie fügen außerdem verschiedene benutzerdefinierte Methoden und Verknüpfungen hinzu, um die Verwendung von DOM zu vereinfachen.

Säbel / Xml

saver / xml ist eine Bibliothek, die die XMLReader- und XMLWriter-Klassen umschließt und erweitert, um ein einfaches Zuordnungssystem und Entwurfsmuster für "xml to object / array" zu erstellen. Schreiben und Lesen von XML ist Single-Pass und kann daher schnell sein und wenig Speicherplatz in großen XML-Dateien erfordern.

FluidXML

FluidXML ist eine PHP-Bibliothek zum Bearbeiten von XML mit einer präzisen und flüssigen API.   Es nutzt XPath und das fließende Programmiermuster, um Spaß und Effektivität zu erzielen.


Drittanbieter (nicht libxml-basiert)

Der Vorteil von DOM / libxml besteht darin, dass Sie sofort eine gute Leistung erzielen, da Sie auf einer nativen Erweiterung basieren. Nicht alle 3rd-Party-Bibliotheken gehen jedoch diese Route hinunter. Einige von ihnen sind unten aufgeführt

PHP Einfacher HTML-DOM-Parser

  • Ein HTML-DOM-Parser, der in PHP5 + geschrieben ist, ermöglicht es Ihnen, HTML auf sehr einfache Weise zu bearbeiten!
  • Erfordert PHP 5+.
  • Unterstützt ungültiges HTML.
  • Finden Sie Tags auf einer HTML-Seite mit Selektoren wie jQuery.
  • Extrahieren Sie Inhalte aus HTML in einer einzelnen Zeile.

Ich empfehle diesen Parser im Allgemeinen nicht. Die Codebasis ist schrecklich und der Parser selbst ist eher langsam und speicherhungrig. Nicht alle jQuery-Selektoren (wie z Kinderselektoren) Sind möglich. Jede der libxml-basierten Bibliotheken sollte dies leicht übertreffen.

PHP-HTML-Parser

PHPHtmlParser ist ein einfacher, flexibler HTML-Parser, mit dem Sie Tags mit einem beliebigen CSS-Selektor wie jQuery auswählen können. Das Ziel ist es, bei der Entwicklung von Werkzeugen zu assistieren, die eine schnelle und einfache Möglichkeit zum Verschrotten von HTML benötigen, egal ob es gültig ist oder nicht! Dieses Projekt wurde ursprünglich von sunra / php-simple-html-dom-parser unterstützt, aber die Unterstützung scheint aufgehört zu haben, so dass dieses Projekt meine Adaption seiner früheren Arbeit ist.

Auch hier würde ich diesen Parser nicht empfehlen. Es ist ziemlich langsam mit hoher CPU-Auslastung. Es gibt auch keine Funktion, um Speicher von erstellten DOM-Objekten zu löschen. Diese Probleme skalieren insbesondere bei verschachtelten Schleifen. Die Dokumentation selbst ist ungenau und falsch geschrieben, und seit dem 14. Apr. 16 wurden keine Korrekturen mehr vorgenommen.

Ganon

  • Ein universeller Tokenizer und HTML / XML / RSS DOM Parser      
    • Fähigkeit, Elemente und ihre Attribute zu manipulieren
    • Unterstützt ungültiges HTML und UTF8
  • Kann erweiterte CSS3-ähnliche Abfragen für Elemente ausführen (wie jQuery - Namespaces unterstützt)
  • Ein HTML-Beautifier (wie HTML Tidy)      
    • Reduzieren Sie CSS und Javascript
    • Attribute sortieren, Zeichen ändern, Einrückung korrigieren, usw.
  • Erweiterbar      
    • Parsen von Dokumenten mit Callbacks basierend auf dem aktuellen Zeichen / Token
    • Die Operationen sind in kleinere Funktionen unterteilt, um das Überschreiben zu erleichtern
  • Schnell und einfach

Habe es nie benutzt. Kann nicht sagen, ob es gut ist.


HTML 5

Sie können das oben genannte zum Analysieren von HTML5 verwenden, aber da kann es Macken geben aufgrund der Markup HTML5 ermöglicht. Also für HTML5 möchten Sie einen dedizierten Parser, wie

html5lib

Eine Python- und PHP-Implementierung eines HTML-Parsers basierend auf der WHATWG HTML5-Spezifikation für maximale Kompatibilität mit großen Desktop-Webbrowsern.

Nach Abschluss von HTML5 werden möglicherweise mehr dedizierte Parser angezeigt. Es gibt auch einen Blogpost der W3 mit dem Titel How-To für HTML 5 Parsing das ist es wert, es auszuprobieren.


Internetdienste

Wenn Sie PHP nicht programmieren möchten, können Sie auch Webdienste verwenden. Im Allgemeinen habe ich sehr wenig Nutzen für diese gefunden, aber das sind nur ich und meine Anwendungsfälle.

YQL

Mit dem YQL-Webdienst können Anwendungen Daten aus verschiedenen Quellen im Internet abfragen, filtern und kombinieren. YQL-Anweisungen haben eine SQL-ähnliche Syntax, die jedem Entwickler mit Datenbankerfahrung vertraut ist.

ScraperWiki.

Über die externe Schnittstelle von ScraperWiki können Sie Daten in der gewünschten Form für die Verwendung im Internet oder in Ihren eigenen Anwendungen extrahieren. Sie können auch Informationen über den Zustand eines Scraper extrahieren.


Reguläre Ausdrücke

Letzte und am wenigsten empfohlen, können Sie Daten aus HTML mit extrahieren Reguläre Ausdrücke. Im Allgemeinen wird davon abgeraten, reguläre Ausdrücke in HTML zu verwenden.

Die meisten Snippets, die Sie im Web finden, um mit Markup zu vergleichen, sind brüchig. In den meisten Fällen arbeiten sie nur für ein ganz bestimmtes Stück HTML. Winzige Markup-Änderungen wie das Hinzufügen von Leerzeichen oder das Hinzufügen oder Ändern von Attributen in einem Tag können dazu führen, dass RegEx fehlschlägt, wenn es nicht ordnungsgemäß geschrieben wurde. Bevor Sie RegEx für HTML verwenden, sollten Sie wissen, was Sie tun.

HTML-Parser kennen bereits die syntaktischen Regeln von HTML. Reguläre Ausdrücke müssen für jede neue RegEx, die Sie schreiben, gelehrt werden. RegEx ist in einigen Fällen in Ordnung, aber es hängt wirklich von Ihrem Anwendungsfall ab.

Sie kann zuverlässigere Parser schreiben, aber schreiben a vollständig und zuverlässig Ein benutzerdefinierter Parser mit regulären Ausdrücken ist Zeitverschwendung, wenn die oben genannten Bibliotheken bereits existieren und eine viel bessere Arbeit damit leisten.

Siehe auch Parsing Html Der Cthulhu Weg


Bücher

Wenn du etwas Geld ausgeben willst, schau es dir an

Ich bin nicht mit PHP Architect oder den Autoren verbunden.


1718
2017-08-26 17:18



Versuchen Einfacher HTML-DOM-Parser

  • Ein in PHP 5+ geschriebener HTML-DOM-Parser, mit dem Sie HTML auf sehr einfache Weise manipulieren können!
  • Erfordert PHP 5+.
  • Unterstützt ungültiges HTML.
  • Finden Sie Tags auf einer HTML-Seite mit Selektoren wie jQuery.
  • Extrahieren Sie Inhalte aus HTML in einer einzelnen Zeile.
  • Herunterladen


Beispiele:


So erhalten Sie HTML-Elemente:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';


So ändern Sie HTML-Elemente:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html;


Inhalt aus HTML extrahieren:

// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;


Kratzen Slashdot:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);

303
2017-11-26 20:02



Benutz einfach DOMDocument-> loadHTML () und damit fertig sein. Der HTML-Parsing-Algorithmus von libxml ist ziemlich gut und schnell und erstickt entgegen der landläufigen Meinung nicht an falsch formatiertem HTML.


224
2017-11-15 22:16



Warum solltest du nicht und wenn du solltest Verwenden Sie reguläre Ausdrücke?

Zunächst einmal eine häufige Fehlbezeichnung: Regexps sind nicht für "Parsing" HTML. Regexes können jedoch "Extrakt" Daten. Extrahieren ist, wofür sie gemacht sind. Der Hauptnachteil der Regex-HTML-Extraktion gegenüber geeigneten SGML-Toolkits oder Baseline-XML-Parsern ist ihr syntaktischer Aufwand und ihre unterschiedliche Zuverlässigkeit.

Berücksichtigen Sie, dass Sie einen etwas verlässlichen HTML-Extraktionsregex erstellen:

<a\s+class="?playbutton\d?[^>]+id="(\d+)".+?    <a\s+class="[\w\s]*title
[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?

ist viel weniger lesbar als ein einfaches phpQuery- oder QueryPath-Äquivalent:

$div->find(".stationcool a")->attr("title");

Es gibt jedoch spezifische Anwendungsfälle, in denen sie helfen können.

  • Viele DOM-Traversal-Frontends geben keine HTML-Kommentare frei <!--, die jedoch manchmal die nützlicheren Anker für die Extraktion sind. Insbesondere Pseudo-HTML-Variationen <$var> oder SGML-Reste sind leicht mit Regexps zu zähmen.
  • Regelmäßige Ausdrücke können häufig Nachbearbeitung speichern. HTML-Entitäten erfordern jedoch häufig manuelle Pflege.
  • Und zuletzt für esehr einfache Aufgaben wie das Extrahieren von <img src = urls, sind sie tatsächlich ein wahrscheinliches Werkzeug. Der Geschwindigkeitsvorteil gegenüber SGML / XML-Parsern kommt meist nur für diese grundlegenden Extraktionsverfahren zum Tragen.

Manchmal ist es sogar ratsam, ein HTML-Snippet mit regulären Ausdrücken zu extrahieren /<!--CONTENT-->(.+?)<!--END-->/und verarbeite den Rest mit den einfacheren HTML-Parser-Frontends.

Hinweis: Ich habe das wirklich App, wo ich alternativ XML-Parsing und reguläre Ausdrücke verwende. Gerade letzte Woche ist das PyQuery-Parsing kaputt gegangen und der Regex funktionierte noch immer. Ja komisch, und ich kann es nicht selbst erklären. Aber so ist es passiert.
Also, stimmt nicht mit den Real-World-Erwägungen überein, nur weil es nicht mit der Regex = Böses Meme übereinstimmt. Aber lasst uns auch nicht zu viel dafür stimmen. Es ist nur eine Nebenbemerkung für dieses Thema.


136
2018-05-01 02:04



phpQuery und QueryPfad sind extrem ähnlich in der Replikation der fließenden jQuery API. Deshalb sind sie auch zwei der einfachsten Ansätze zu richtig HTML in PHP analysieren.

Beispiele für QueryPath

Grundsätzlich erstellen Sie zuerst eine abfragbare DOM-Struktur aus einer HTML-Zeichenfolge:

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

Das resultierende Objekt enthält eine vollständige Baumdarstellung des HTML-Dokuments. Es kann mit DOM-Methoden durchlaufen werden. Der übliche Ansatz besteht jedoch darin, CSS-Selektoren wie in jQuery zu verwenden:

 $qp->find("div.classname")->children()->...;

 foreach ($qp->find("p img") as $img) {
     print qp($img)->attr("src");
 }

Meistens willst du einfach verwenden #id und .class oder DIV Tag Selektoren für ->find(). Aber Sie können auch verwenden XPath Aussagen, die manchmal schneller sind. Auch typische jQuery-Methoden wie ->children() und ->text() und besonders ->attr() vereinfachen Sie das Extrahieren der richtigen HTML-Snippets. (Und schon haben ihre SGML-Entitäten entschlüsselt.)

 $qp->xpath("//div/p[1]");  // get first paragraph in a div

QueryPath erlaubt auch das Einfügen neuer Tags in den Stream (->append) und später ein aktualisiertes Dokument ausgeben und verschönern (->writeHTML). Es kann nicht nur fehlerhaftes HTML, sondern auch verschiedene XML-Dialekte (mit Namespaces) analysieren und sogar Daten aus HTML-Mikroformaten (XFN, vCard) extrahieren.

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

.

phpQuery oder QueryPath?

Im Allgemeinen ist QueryPath besser für die Manipulation von Dokumenten geeignet. PhpQuery implementiert auch einige Pseudo-AJAX-Methoden (nur HTTP-Anfragen), um jQuery näher zu kommen. Es wird gesagt, dass phpQuery oft schneller ist als QueryPath (wegen der geringeren Gesamtanzahl von Funktionen).

Für weitere Informationen zu den Unterschieden siehe Dieser Vergleich auf der Wayback-Maschine von tagbyte.org. (Ursprüngliche Quelle ist verschwunden, also hier ist ein Internet-Archiv-Link. Ja, Sie können immer noch fehlende Seiten finden, Leute.)

Und hier ist eine umfassende QueryPath-Einführung.

Vorteile

  • Einfachheit und Zuverlässigkeit
  • Einfach zu verwendende Alternativen ->find("a img, a object, div a")
  • Richtige Daten Unescaping (im Vergleich zum regulären Ausdruck Grepping)

126
2017-08-26 17:20



Simple HTML DOM ist ein großartiger Open-Source-Parser:

simplehtmldom.sourceforge

Es behandelt DOM-Elemente in einer objektorientierten Weise und die neue Iteration hat eine große Abdeckung für nicht-konformen Code. Es gibt auch einige großartige Funktionen, wie Sie sie in JavaScript sehen, wie zum Beispiel die "find" -Funktion, die alle Instanzen von Elementen dieses Tag-Namens zurückgibt.

Ich habe es in einer Reihe von Tools verwendet und es auf vielen verschiedenen Arten von Webseiten getestet, und ich denke, es funktioniert großartig.


85
2017-10-04 13:14



Ein allgemeiner Ansatz, den ich hier nicht erwähnt habe, ist das Ausführen von HTML Aufgeräumt, die gesetzt werden kann, um garantiert gültiges XHTML auszuspucken. Dann können Sie jede alte XML-Bibliothek darauf verwenden.

Aber zu Ihrem speziellen Problem sollten Sie sich dieses Projekt ansehen: http://fivefilters.org/content-only/ - Es ist eine modifizierte Version des Lesbarkeit Algorithmus, der nur den Textinhalt (nicht Kopf- und Fußzeilen) von einer Seite extrahiert.


58
2017-11-06 21:02



Für 1a und 2: Ich würde für die neue Symfony Componet-Klasse DOMCrawler stimmen ( DomCrawler ). Diese Klasse ermöglicht Abfragen ähnlich wie CSS-Selektoren. Werfen Sie einen Blick auf diese Präsentation für reale Beispiele: news-of-the-symfony2-Welt.

Die Komponente ist für den eigenständigen Betrieb konzipiert und kann ohne Symfony verwendet werden.

Der einzige Nachteil ist, dass es nur mit PHP 5.3 oder neuer funktioniert.


54
2018-04-14 19:08



Dies wird allgemein als bezeichnet Screen Scraping, Apropos. Die Bibliothek, die ich dafür benutzt habe, ist Einfacher HTML Dom Parser.


51
2018-01-05 14:49



Wir haben schon einige Crawler für unsere Bedürfnisse erstellt. Am Ende des Tages sind es normalerweise einfache reguläre Ausdrücke, die das Beste tun. Während oben aufgelistete Bibliotheken gut für den Grund sind, aus dem sie erstellt werden, wenn Sie wissen, was Sie suchen, sind reguläre Ausdrücke ein sicherer Weg zu gehen, da Sie auch nicht gültig umgehen können HTML/XHTML Strukturen, die fehlschlagen würden, wenn sie über die meisten Parser geladen werden.


40
2018-04-15 13:12



ich empfehle PHP Einfacher HTML-DOM-Parser.

Es hat wirklich nette Eigenschaften, wie:

foreach($html->find('img') as $element)
       echo $element->src . '<br>';

37
2017-11-15 22:24