parsing to - Wie parst und verarbeitest du HTML / XML in PHP?



parse line (24)

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


Answers

XML_HTMLSax ist ziemlich stabil - auch wenn es nicht mehr gepflegt wird. Eine andere Möglichkeit könnte sein, HTML über Html Tidy zu leiten und dann mit Standard-XML-Tools zu parsen.


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


Eine andere Möglichkeit, die Sie ausprobieren können, ist QueryPath . Es ist inspiriert von jQuery, aber auf dem Server in PHP und in Drupal .


Sie könnten versuchen, etwas wie HTML Tidy zu verwenden, um "kaputtes" HTML zu bereinigen und das HTML in XHTML zu konvertieren, das Sie dann mit einem XML-Parser analysieren können.


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

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.


Das klingt nach einer guten Aufgabenbeschreibung der W3C XPath Technologie. Es ist einfach, Abfragen wie " href alle href Attribute in img Tags, die in <foo><bar><baz> elements verschachtelt sind, auszudrücken." Da ich kein PHP-Buff bin, kann ich Ihnen nicht sagen, in welcher Form XPath verfügbar ist. Wenn Sie ein externes Programm zur Verarbeitung der HTML-Datei aufrufen können, sollten Sie in der Lage sein, eine Befehlszeilenversion von XPath zu verwenden. Eine kurze Einführung finden Sie unter XPath .


Advanced Html Dom ist ein einfacher HTML- DOM Ersatz, der dieselbe Schnittstelle bietet, aber DOM-basiert ist, was bedeutet, dass keine der zugehörigen Speicherprobleme auftreten.

Es hat auch volle CSS-Unterstützung, einschließlich jQuery Erweiterungen.


phpQuery und QueryPath sind extrem ähnlich beim Replizieren der fließenden jQuery-API. Das ist auch der Grund, warum sie zwei der einfachsten Ansätze zum korrekten Parsen von HTML in PHP sind.

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 möchten Sie einfache #id und .class oder DIV Tag Selektoren für ->find() . Sie können aber auch XPath Anweisungen verwenden, die manchmal schneller sind. Auch typische jQuery-Methoden wie ->children() und ->text() und insbesondere ->attr() vereinfachen 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 die spätere Ausgabe und Verschönerung eines aktualisierten Dokuments ( ->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).

Weitere Informationen zu den Unterschieden finden Sie in diesem 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)

Es gibt mehrere Gründe, HTML nicht mit regulären Ausdrücken zu analysieren. Aber wenn Sie die vollständige Kontrolle darüber haben, was HTML generiert, können Sie mit einem einfachen regulären Ausdruck arbeiten.

Darüber ist eine Funktion, die HTML durch regulären Ausdruck analysiert. Beachten Sie, dass diese Funktion sehr empfindlich ist und fordert, dass der HTML bestimmte Regeln befolgt, aber sie funktioniert in vielen Szenarien sehr gut. Wenn Sie einen einfachen Parser wollen und keine Bibliotheken installieren wollen, geben Sie folgendes ein:

function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));

    return $result;
}

function extract_data($str) {
    return (is_array($str))
        ? array_map('extract_data', $str)
        : ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</\1>#s', $str, $matches))
            ? $str
            : array_map(('extract_data'), array_combine_($matches[1], $matches[2])));
}

print_r(extract_data(file_get_contents("http://www.google.com/")));

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 aufgeführte Bibliotheken für den Grund gut sind, aus dem sie erstellt werden, wenn Sie wissen, wonach Sie suchen, sind reguläre Ausdrücke ein sicherer Weg zu gehen, da Sie auch nicht gültige HTML / XHTML Strukturen behandeln können, die beim Laden fehlschlagen würden über die meisten Parser.


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.


Warum solltest du nicht und wann solltest du reguläre Ausdrücke verwenden?

Zunächst einmal eine häufige Fehlbezeichnung: Regexps sind nicht zum " Parsen " von HTML. Regexes können jedoch Daten " extrahieren " . 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 <!-- , die jedoch manchmal die nützlicheren Anker für die Extraktion sind. Insbesondere Pseudo-HTML-Varianten <$var> oder SGML-Reste sind mit Regexs einfach zu zähmen.
  • Regelmäßige Ausdrücke können häufig Nachbearbeitung speichern. HTML-Entitäten erfordern jedoch häufig manuelle Pflege.
  • Und schließlich sind sie für sehr einfache Aufgaben wie das Extrahieren von <img src = urls ein wahrscheinliches Werkzeug. Der Geschwindigkeitsvorteil gegenüber SGML / XML-Parsern kommt meist nur für diese grundlegenden Extraktionsverfahren zum Tragen.

Es ist manchmal sogar ratsam, ein HTML-Snippet mit den regulären Ausdrücken /<!--CONTENT-->(.+?)<!--END-->/

Hinweis: Ich habe diese 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.


Ich habe eine Bibliothek namens PHPPowertools/DOM-Query , mit der Sie HTML5- und XML-Dokumente genauso wie mit jQuery crawlen können.

Unter der Haube verwendet es symfony / DomCrawler für die Umwandlung von CSS-Selektoren in XPath Selektoren. Es verwendet immer dasselbe DomDocument, auch wenn ein Objekt an ein anderes Objekt übergeben wird, um eine anständige Leistung sicherzustellen.

Beispiel Verwendung:

namespace PowerTools;

// Get file content
$htmlcode = file_get_contents('https://github.com');

// Define your DOMCrawler based on file string
$H = new DOM_Query($htmlcode);

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query($H->select('body'));

// Passing a string (CSS selector)
$s = $H->select('div.foo');

// Passing an element object (DOM Element)
$s = $H->select($documentBody);

// Passing a DOM Query object
$s = $H->select( $H->select('p + p'));

// Select the body tag
$body = $H->select('body');

// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');

// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');

// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
    return $i . " - " . $val->attr('class');
});

// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');

// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));

// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});

// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();

// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');

// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');

[...]

Unterstützte Methoden:

  1. Umbenennung in, Select 'aus offensichtlichen Gründen
  2. Umbenennung in 'void', da 'leer' ein reserviertes Wort in PHP ist

HINWEIS :

Die Bibliothek enthält auch einen eigenen Zero-Configuration-Autoloader für PSR-0-kompatible Bibliotheken. Das enthaltene Beispiel sollte ohne weitere Konfiguration funktionieren. Alternativ können Sie es mit Komponisten verwenden.


Ich habe eine Bibliothek namens HTML5DOMDocument erstellt, die unter https://github.com/ivopetkov/html5-dom-document-php frei verfügbar ist

Es unterstützt auch Abfrage-Selektoren, von denen ich denke, dass sie in Ihrem Fall sehr hilfreich sind. Hier ist ein Beispielcode:

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello</h1><div class="content">This is some text</div></body></html>');
echo $dom->querySelector('h1')->innerHTML;

Es gibt viele Möglichkeiten, HTML / XML-DOM zu verarbeiten, von denen die meisten bereits erwähnt wurden. Daher werde ich nicht versuchen, diese selbst aufzuführen.

Ich möchte nur hinzufügen, dass ich persönlich die Verwendung der DOM-Erweiterung bevorzuge und warum:

  • iit nutzt den Leistungsvorteil des zugrunde liegenden C-Codes optimal aus
  • es ist OO PHP (und erlaubt mir, es zu unterklassifizieren)
  • es ist eher ein niedriges Level (was es mir erlaubt, es als eine nicht aufgeblähte Grundlage für fortgeschritteneres Verhalten zu verwenden)
  • Es bietet Zugriff auf jeden Teil des DOM (anders als zB SimpleXml, das einige der weniger bekannten XML-Funktionen ignoriert)
  • Es hat eine Syntax, die für das DOM-Crawlen verwendet wird und der Syntax in nativem Javascript ähnelt.

Und obwohl ich die Möglichkeit, CSS-Selektoren für DOMDocument , DOMDocument , gibt es eine recht einfache und bequeme Möglichkeit, diese Funktion hinzuzufügen: Unterklassen des DOMDocument und Hinzufügen von JS-ähnlichen Methoden querySelectorAll und querySelector zu Ihrer Unterklasse.

Zum Parsen der Selektoren empfehle ich die sehr minimalistische CssSelector-Komponente aus dem Symfony-Framework . Diese Komponente übersetzt nur CSS-Selektoren in XPath-Selektoren, die dann in einen DOMXpath , um die entsprechende Nodeliste abzurufen.

Sie können dann diese Unterklasse (immer noch auf sehr niedriger Ebene) als Grundlage für höhere Klassen verwenden, die z. Analysieren Sie sehr spezifische XML-Typen oder fügen Sie mehr jQuery-ähnliches Verhalten hinzu.

Der folgende Code kommt direkt aus meiner PHPPowertools/DOM-Query und verwendet die beschriebene Technik.

Für die HTML-Analyse:

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '<!DOCTYPE ') === 0 || strpos($data_start, '<html>') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('<!DOCTYPE html><html><head><meta charset="' . $encoding . '" /></head><body></body></html>');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

Siehe auch Parsing von XML-Dokumenten mit CSS-Selektoren von Symfonys Schöpfer Fabien Potencier zu seiner Entscheidung, die CssSelector-Komponente für Symfony zu erstellen und zu verwenden.


JSON und Array aus XML in drei Zeilen:

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

Ta da!


Probieren Sie den einfachen HTML-DOM-Parser aus

  • 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.
  • Download


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);

Dies wird übrigens auch als Screen Scraping bezeichnet . Die Bibliothek, die ich dafür benutzt habe, ist Simple HTML Dom Parser .


Ich habe einen universellen XML-Parser geschrieben, der problemlos mit GB-Dateien umgehen kann. Es basiert auf XMLReader und es ist sehr einfach zu bedienen:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

Hier ist der Github Repo: XmlExtractor



Native XML-Erweiterungen

Ich bevorzuge eine der nativen XML-Erweiterungen, da sie mit PHP geliefert werden, sind in der Regel schneller als alle 3rd-Party-Bibliotheken und geben mir alle Kontrolle über das Markup.

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, HTML (real) zu analysieren und zu modifizieren und kann XPath-Abfragen durchführen . 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 unter Grabbing des href-Attributs eines A-Elements und eine allgemeine konzeptionelle Übersicht finden Sie unter DOMDocument in php

Die Verwendung der DOM-Erweiterung wurde ausführlich in behandelt . Wenn Sie sich für die Verwendung der DOM-Erweiterung entscheiden, können Sie sicher sein, dass die meisten Probleme durch Suchen / Durchsuchen von 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 kann gefunden werden, indem alle Werte von h1 Tags mit PHP abgerufen werden

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 einen XML-Push-Parser im SAX Stil. 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.

SimpleXml

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 es gibt viele weitere Beispiele im PHP-Handbuch .

Bibliotheken von Drittanbietern (libxml-basiert)

Wenn Sie eine libxml eines Drittanbieters bevorzugen, würde ich vorschlagen, eine Lib zu verwenden, die tatsächlich DOM / libxml anstelle von String-Parsing verwendet.

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-Dokumenten mit Es benötigt DomCrawler von Symfony2-Komponenten zum Durchlaufen der DOM- Struktur und erweitert es durch Hinzufügen von Methoden zur Manipulation der DOM-Struktur von HTML-Dokumenten.

phpQuery (seit Jahren nicht 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.

QueryPath

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.

fDOMDocument

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.

sabre/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 (z. B. untergeordnete Selektoren ) 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 für das Analysieren von HTML5 verwenden, aber es kann Macken aufgrund des Markups geben, das HTML5 zulässt. 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 von der W3 mit dem Titel How-To für HTML 5 Parsing , die es wert ist, zu überprüfen.

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

Zuletzt und am wenigsten empfohlen , können Sie Daten aus HTML mit regulären Ausdrücken extrahieren. 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 können zuverlässigere Parser schreiben , aber das Schreiben eines vollständigen und zuverlässigen benutzerdefinierten Parsers 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 The Cthulhu Way

Bücher

Wenn du etwas Geld ausgeben willst, schau es dir an

Ich bin nicht mit PHP Architect oder den Autoren verbunden.


QueryPath ist gut, aber seien Sie vorsichtig mit dem "Tracking-Status", denn wenn Sie nicht wissen , was es bedeutet, können Sie viel Zeit mit der Fehlersuche verschwenden, um herauszufinden, was passiert ist und warum der Code nicht funktioniert.

Es bedeutet, dass jeder Aufruf der Ergebnismenge die Ergebnismenge im Objekt ändert. Sie ist nicht wie in jquery verkettbar, da jede Verknüpfung eine neue Menge ist. Sie haben eine einzelne Menge, die aus der Abfrage resultiert und jeder Funktionsaufruf ändert dieser einzelne Satz.

Um jquery-ähnliches Verhalten zu erhalten, müssen Sie verzweigen, bevor Sie eine Filter / Modify-ähnliche Operation durchführen, das heißt, sie spiegelt das, was in jQuery passiert, viel genauer wider.

$results = qp("div p");
$forename = $results->find("input[name='forename']");

$results enthält nun die Ergebnismenge für input[name='forename'] NICHT die ursprüngliche Abfrage "div p" das hat mich viel gestolpert, was ich herausgefunden habe ist, dass QueryPath die Filter und die gefundenen Dateien und alles, was deine Ergebnisse und speichert, aufspürt sie im Objekt. Sie müssen dies stattdessen tun

$forename = $results->branch()->find("input[name='forname']")

dann werden die $results nicht geändert und du kannst die Ergebnismenge immer wieder verwenden, vielleicht kann jemand mit viel mehr Wissen das ein bisschen aufklären, aber es ist im Grunde so, wie ich es gefunden habe.


Ein allgemeiner Ansatz, den ich hier nicht erwähnt habe, ist, HTML über Tidy laufen zu lassen, das so eingestellt werden kann, dass es garantiert gültiges XHTML ausspuckt. Dann können Sie jede alte XML-Bibliothek darauf verwenden.

Aber zu Ihrem spezifischen Problem sollten Sie sich dieses Projekt ansehen: http://fivefilters.org/content-only/ - es ist eine modifizierte Version des Readability , der nur den textuellen Inhalt (nicht die Header) extrahiert und Fußzeilen) von einer Seite.


Ich schlage ElementTree . Es gibt andere kompatible Implementierungen derselben API, z. B. lxml und cElementTree in der Python-Standardbibliothek selbst; Aber in diesem Zusammenhang ist es vor allem die Geschwindigkeit, die sie hinzufügen - die Leichtigkeit des Programmierens hängt von der API ab, die ElementTree definiert.

Nach dem Aufbau einer Element-Instanz e aus dem XML, zB mit der XML Funktion, oder durch Parsing einer Datei mit etwas Ähnlichem

import xml.etree.ElementTree
e = xml.etree.ElementTree.parse('thefile.xml').getroot()

oder irgendeine der vielen anderen Möglichkeiten, die bei ElementTree gezeigt ElementTree , machen Sie einfach etwas wie:

for atype in e.findall('type'):
    print(atype.get('foobar'))

und ähnliche, normalerweise ziemlich einfache Codemuster.





php xml parsing xml-parsing html-parsing