Domanda Come si analizzano e si elaborano HTML / XML in PHP?


Come si può analizzare HTML / XML ed estrarre informazioni da esso?


1893
2017-08-26 17:19


origine


risposte:


Estensioni XML native

Preferisco usare uno dei estensioni XML native dal momento che vengono forniti in bundle con PHP, sono in genere più veloci di tutte le librerie di terze parti e mi danno tutto il controllo di cui ho bisogno rispetto al markup.

DOM

L'estensione DOM consente di operare su documenti XML tramite DOM API con PHP 5. È un'implementazione del Document Object Model Core Level 3 del W3C, un'interfaccia indipendente dalla piattaforma e dalla lingua che consente a programmi e script di accedere e aggiornare dinamicamente il contenuto, la struttura e lo stile dei documenti.

DOM è in grado di analizzare e modificare l'HTML (rotto) del mondo reale e può farlo Query XPath. È basato su libxml.

Ci vuole del tempo per essere produttivi con DOM, ma quel tempo ne vale la pena IMO. Dal momento che DOM è un'interfaccia indipendente dal linguaggio, troverai implementazioni in molte lingue, quindi se hai bisogno di cambiare il tuo linguaggio di programmazione, è probabile che saprai già come usare l'API DOM di quella lingua.

Un esempio di utilizzo di base può essere trovato in Afferrando l'attributo href di un elemento A e una panoramica concettuale generale può essere trovata a DOMDocument in php

Come utilizzare l'estensione DOM è stato ampiamente trattato su StackOverflowquindi, se decidi di utilizzarlo, puoi essere certo che la maggior parte dei problemi in cui ti imbatti possa essere risolta effettuando una ricerca / navigando su Stack Overflow.

XMLReader

L'estensione XMLReader è un parser XML pull. Il lettore agisce come un cursore in avanti sul flusso del documento e si ferma su ciascun nodo sulla strada.

XMLReader, come DOM, è basato su libxml. Non sono a conoscenza di come attivare il modulo HTML Parser, quindi è probabile che l'uso di XMLReader per l'analisi dell'HT spezzato potrebbe essere meno affidabile rispetto all'utilizzo di DOM in cui è possibile indicarlo esplicitamente per utilizzare il modulo parser HTML di libxml.

Un esempio di utilizzo di base può essere trovato a ottenere tutti i valori dai tag h1 usando php

XML Parser

Questa estensione consente di creare parser XML e quindi definire gestori per diversi eventi XML. Ogni parser XML ha anche alcuni parametri che puoi regolare.

La libreria XML Parser si basa anche su libxml e implementa a SAX parser XML di stile. Potrebbe essere una scelta migliore per la gestione della memoria rispetto a DOM o SimpleXML, ma sarà più difficile lavorare con il parser di pull implementato da XMLReader.

SimpleXML

L'estensione SimpleXML fornisce un set di strumenti molto semplice e facilmente utilizzabile per convertire XML in un oggetto che può essere elaborato con i normali selettori di proprietà e gli iteratori di array.

SimpleXML è un'opzione quando si conosce che l'HTML è XHTML valido. Se hai bisogno di analizzare l'HTML spezzato, non prendere nemmeno in considerazione SimpleXml perché si strozzerà.

Un esempio di utilizzo di base può essere trovato a Un programma semplice per il nodo CRUD e il valore del nodo del file xml e c'è molti altri esempi nel manuale PHP.


Librerie di terze parti (basate su libxml)

Se preferisci usare una lib di terze parti, ti suggerirei di usare una lib che effettivamente usi DOM/libxml sotto invece di analisi delle stringhe.

FluentDom

FluentDOM fornisce un'interfaccia XML fluida simile a jQuery per il DOMDocument in PHP. I selettori sono scritti in XPath o CSS (utilizzando un convertitore da CSS a XPath). Le versioni attuali estendono il DOM implementando le interfacce standard e aggiungono funzionalità dal DOM Living Standard. FluentDOM può caricare formati come JSON, CSV, JsonML, RabbitFish e altri. Può essere installato tramite Composer.

HtmlPageDom

Wa72 \ HtmlPageDom` è una libreria PHP per una facile manipolazione di HTML   i documenti che utilizzano richiede DomCrawler da Symfony2   componenti per attraversare il   Albero DOM e lo estende aggiungendo metodi per manipolare il DOM   albero di documenti HTML.

phpQuery (non aggiornato da anni)

phpQuery è un'API DOM (Document Object Model) basata su selettore CSS3 pilotabile dal lato server, basata su jQuery JavaScript Library scritta in PHP5 e fornisce CLI (Command Line Interface) aggiuntiva.

Vedi anche: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom fornisce strumenti per lavorare con documenti e strutture DOM. Attualmente, offriamo Zend_Dom_Query, che fornisce un'interfaccia unificata per interrogare i documenti DOM utilizzando sia i selettori XPath che CSS.

percorso query

QueryPath è una libreria PHP per manipolare XML e HTML. È progettato per funzionare non solo con file locali, ma anche con servizi Web e risorse di database. Implementa gran parte dell'interfaccia jQuery (compresi i selettori in stile CSS), ma è fortemente ottimizzata per l'utilizzo lato server. Può essere installato tramite Composer.

fDOMDocument

fDOMDocument estende il DOM standard per utilizzare le eccezioni in tutte le occasioni di errori anziché gli avvisi o le avvertenze PHP. Aggiungono anche vari metodi e scorciatoie personalizzati per comodità e per semplificare l'uso del DOM.

saber / xml

sabre / xml è una libreria che avvolge ed estende le classi XMLReader e XMLWriter per creare un semplice sistema di mappatura e design pattern "xml to object / array". Scrivere e leggere XML è single-pass e può quindi essere veloce e richiedere poca memoria su file xml di grandi dimensioni.

FluidXML

FluidXML è una libreria PHP per manipolare XML con un'API concisa e fluente.   Sfrutta XPath e il modello di programmazione fluente per essere divertente ed efficace.


3rd-Party (non basato su libxml)

Il vantaggio di creare su DOM / libxml è che si ottengono buone prestazioni out of the box perché si basa su un'estensione nativa. Tuttavia, non tutte le librerie di terze parti seguono questa rotta. Alcuni di quelli elencati di seguito

Parser DOM HTML HTML semplice

  • Un parser DOM HTML scritto in PHP5 + ti consente di manipolare l'HTML in un modo molto semplice!
  • Richiede PHP 5+.
  • Supporta HTML non valido.
  • Trova i tag su una pagina HTML con selettori come jQuery.
  • Estrai contenuti da HTML in una singola riga.

Generalmente non consiglio questo parser. Il codebase è orribile e lo stesso parser è piuttosto lento e ha fame di memoria. Non tutti i selettori jQuery (come selettori di bambini) sono possibili. Qualsiasi libreria basata su libxml dovrebbe sovraperformare facilmente.

Parser HTML Html

PHPHtmlParser è un parser html semplice e flessibile che ti permette di selezionare tag usando qualsiasi selettore di CSS, come jQuery. L'obiettivo è quello di assisterti nello sviluppo di strumenti che richiedono un modo semplice e veloce per scartare l'html, che sia valido o no! Questo progetto era originale supportato da sunra / php-simple-html-dom-parser ma il supporto sembra essersi fermato, quindi questo progetto è il mio adattamento del suo lavoro precedente.

Ancora una volta, non consiglierei questo parser. È piuttosto lento con un elevato utilizzo della CPU. Non esiste inoltre alcuna funzione per cancellare la memoria degli oggetti DOM creati. Questi problemi si riducono in modo particolare con i cicli annidati. La documentazione stessa è inaccurata e errata, senza alcuna risposta alle correzioni dal 14 aprile 16.

Ganon

  • Un tokenizzatore universale e un parser DOM DOM per HTML / XML / RSS      
    • Capacità di manipolare elementi e i loro attributi
    • Supporta HTML non valido e UTF8
  • Può eseguire query avanzate tipo CSS3 su elementi (come jQuery - namespace supportati)
  • Un beautifier HTML (come HTML Tidy)      
    • Minimizza CSS e Javascript
    • Ordina attributi, cambia il carattere, il rientro corretto, ecc.
  • Estensibile      
    • Analisi di documenti mediante callback basati sul personaggio / token corrente
    • Operazioni separate in funzioni più piccole per una facile sostituzione
  • Veloce e facile

Mai usato Non posso dire se va bene.


HTML 5

È possibile utilizzare quanto sopra per l'analisi di HTML5, ma ci possono essere stranezze grazie alla marcatura HTML5 consente. Quindi per HTML5 si vuole considerare l'utilizzo di un parser dedicato, come

html5lib

Implementazioni Python e PHP di un parser HTML basato sulla specifica HTML5 WHATWG per la massima compatibilità con i principali browser Web desktop.

Potremmo vedere più parser dedicati una volta finalizzato HTML5. C'è anche un blogpost dal W3 intitolato How-To per l'analisi HTML 5 vale la pena di provarlo


Servizi web

Se non hai voglia di programmare PHP, puoi anche usare i servizi Web. In generale, ho trovato pochissima utilità per questi, ma sono solo io e i miei casi d'uso.

YQL

Il servizio Web YQL consente alle applicazioni di interrogare, filtrare e combinare dati provenienti da diverse fonti su Internet. Le istruzioni YQL hanno una sintassi simile a SQL, familiare a qualsiasi sviluppatore con esperienza nel database.

ScraperWiki.

L'interfaccia esterna di ScraperWiki consente di estrarre i dati nel modulo che si desidera utilizzare sul Web o nelle proprie applicazioni. È inoltre possibile estrarre informazioni sullo stato di qualsiasi raschiatore.


Espressioni regolari

Ultimo e meno raccomandato, puoi estrarre dati da HTML con espressioni regolari. In generale, l'uso delle espressioni regolari su HTML è sconsigliato.

La maggior parte dei frammenti che troverai sul Web per trovare corrispondenza con il markup sono fragili. Nella maggior parte dei casi stanno lavorando solo per un pezzo di HTML molto particolare. Piccole modifiche al markup, come l'aggiunta di spazi bianchi da qualche parte, o l'aggiunta, o la modifica di attributi in un tag, possono fare in modo che la RegEx fallisca quando non è stata scritta correttamente. Dovresti sapere cosa stai facendo prima di usare RegEx su HTML.

I parser HTML conoscono già le regole sintattiche dell'HTML. Le espressioni regolari devono essere insegnate per ogni nuovo RegEx che scrivi. RegEx va bene in alcuni casi, ma in realtà dipende dal tuo caso d'uso.

tu posso scrivere parser più affidabili, ma scrivendo a completo e affidabile parser personalizzato con espressioni regolari è una perdita di tempo quando le librerie di cui sopra esistono già e fare un lavoro molto migliore su questo.

Vedi anche Parsing Html The Cthulhu Way


Libri

Se vuoi spendere un po 'di soldi, dai un'occhiata

Non sono affiliato con PHP Architect o gli autori.


1717
2017-08-26 17:18



Provare Simple HTML DOM Parser

  • Un parser DOM HTML scritto in PHP 5+ che ti permette di manipolare l'HTML in un modo molto semplice!
  • Richiede PHP 5+.
  • Supporta HTML non valido.
  • Trova i tag su una pagina HTML con selettori come jQuery.
  • Estrai contenuti da HTML in una singola riga.
  • Scaricare


Esempi:


Come ottenere elementi HTML:

// 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>';


Come modificare gli elementi HTML:

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


Estrai contenuti da HTML:

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


Scraping 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



Basta usare DOMDocument-> loadHTML () e sii fatto con esso. L'algoritmo di parsing HTML di libxml è abbastanza buono e veloce, e contrariamente alla credenza popolare, non soffoca l'HTML malformato.


224
2017-11-15 22:16



Perché non dovresti e quando dovresti usare le espressioni regolari?

Prima di tutto, un termine improprio comune: Regexps non è per "parsing" HTML. I regex possono comunque "estratto" dati. L'estrazione è ciò per cui sono fatti. Il principale svantaggio della regex dell'estrazione HTML rispetto ai corretti toolkit SGML o ai parser XML di base è il loro sforzo sintattico e la loro affidabilità variabile.

Considera che rendere un regex un'espulsione HTML piuttosto affidabile:

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

è molto meno leggibile di un semplice equivalente phpQuery o QueryPath:

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

Esistono tuttavia casi d'uso specifici in cui possono aiutare.

  • Molti front-end del DOM non rivelano commenti HTML <!--, che tuttavia a volte sono gli ancoraggi più utili per l'estrazione. In particolare le variazioni pseudo-HTML <$var> o residui SGML sono facili da domare con espressioni regolari.
  • Spesso le espressioni regolari possono salvare la post-elaborazione. Tuttavia, le entità HTML spesso richiedono il controllo manuale.
  • E infine, per ecompiti estremamente semplici come l'estrazione di <img src = urls, sono in effetti uno strumento probabile. Il vantaggio in termini di velocità rispetto ai parser SGML / XML si limita principalmente a giocare per queste procedure di estrazione molto semplici.

Talvolta è anche consigliabile pre-estrarre un frammento di codice HTML usando espressioni regolari /<!--CONTENT-->(.+?)<!--END-->/ed elaborare il resto usando i frontend del parser HTML più semplici.

Nota: In realtà ho questo App, dove utilizzo l'analisi XML e le espressioni regolari in alternativa. Proprio la scorsa settimana si è rotto l'analisi di PyQuery, e la regex ha funzionato ancora. Sì, strano, e non posso spiegarlo da solo. Ma così è successo.
Quindi, per favore, non votare le considerazioni del mondo reale, solo perché non corrisponde al meme regex = evil. Ma non votiamo troppo a questo. È solo un sidenote per questo argomento.


136
2018-05-01 02:04



phpQuery e percorso query sono estremamente simili nella replica della fluente API jQuery. Questo è anche il motivo per cui sono due degli approcci più facili propriamente analizzare HTML in PHP.

Esempi per QueryPath

In pratica, per prima cosa crei un albero DOM interrogabile da una stringa HTML:

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

L'oggetto risultante contiene una rappresentazione ad albero completa del documento HTML. Può essere attraversato usando i metodi DOM. Ma l'approccio comune è usare i selettori CSS come in jQuery:

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

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

Principalmente vuoi usare semplicemente #id e .class o DIV tag selezionatori per ->find(). Ma puoi anche usare XPath dichiarazioni, che a volte sono più veloci. Anche i tipici metodi jQuery come ->children() e ->text() e in particolare ->attr() semplificare l'estrazione degli snippet HTML corretti. (E hanno già decodificato le loro entità SGML).

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

QueryPath consente inoltre di iniettare nuovi tag nello stream (->append), e in seguito restituisce e migliora un documento aggiornato (->writeHTML). È in grado non solo di analizzare l'HTML malformato, ma anche vari dialetti XML (con namespace) e persino di estrarre i dati dai microformati HTML (XFN, vCard).

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

.

phpQuery o QueryPath?

Generalmente QueryPath è più adatto per la manipolazione di documenti. Mentre phpQuery implementa anche alcuni metodi pseudo AJAX (solo richieste HTTP) per somigliare più da vicino a jQuery. Si dice che phpQuery sia spesso più veloce di QueryPath (a causa del minor numero di funzioni complessive).

Per ulteriori informazioni sulle differenze vedi questo confronto sul wayback machine da tagbyte.org. (La fonte originale è scomparsa, quindi ecco un link all'archivio Internet. Sì, puoi ancora individuare le pagine mancanti, le persone.)

Ed ecco una presentazione completa di QueryPath.

vantaggi

  • Semplicità e affidabilità
  • Alternative semplici da usare ->find("a img, a object, div a")
  • Dati corretti che non escono (in confronto all'espressione grepping regolare)

126
2017-08-26 17:20



Simple HTML DOM è un ottimo parser open source:

simplehtmldom.sourceforge

Tratta gli elementi DOM in modo orientato agli oggetti, e la nuova iterazione ha un sacco di copertura per il codice non conforme. Ci sono anche alcune grandi funzioni come quelle che vedresti in JavaScript, come la funzione "trova", che restituirà tutte le istanze di elementi di quel nome di tag.

Ho usato questo in un certo numero di strumenti, testandolo su molti diversi tipi di pagine web, e penso che funzioni alla grande.


85
2017-10-04 13:14



Un approccio generale che non ho visto qui è l'esecuzione di HTML Ordinato, che può essere impostato per sputare fuori XHTML valido garantito. Quindi puoi usare qualsiasi vecchia libreria XML su di esso.

Ma per il tuo problema specifico, dovresti dare un'occhiata a questo progetto: http://fivefilters.org/content-only/ - è una versione modificata del leggibilità algoritmo, che è progettato per estrarre solo il contenuto testuale (non intestazioni e piè di pagina) da una pagina.


58
2017-11-06 21:02



Per 1a e 2: voterei per la nuova classe Component di Symfony DOMCrawler ( DomCrawler ). Questa classe consente query simili ai selettori CSS. Dai un'occhiata a questa presentazione per esempi reali: news-of-the-Symfony2-mondo.

Il componente è progettato per funzionare autonomamente e può essere utilizzato senza Symfony.

L'unico inconveniente è che funzionerà solo con PHP 5.3 o versioni successive.


54
2018-04-14 19:08



Questo è comunemente indicato come raschiatura dello schermo, a proposito. La libreria che ho usato per questo è Semplice HTML Dom Parser.


51
2018-01-05 14:49



Abbiamo creato un bel po 'di crawler per i nostri bisogni prima. Alla fine della giornata, di solito sono le espressioni regolari semplici a fare la cosa migliore. Mentre le librerie elencate sopra sono valide per la ragione per cui sono state create, se sai cosa stai cercando, le espressioni regolari sono un modo più sicuro per andare, dato che puoi gestirle anche non valide HTML/XHTML strutture, che fallirebbero, se caricate tramite la maggior parte dei parser.


40
2018-04-15 13:12



io raccomando Parser DOM HTML HTML semplice.

Ha davvero delle belle funzionalità, come:

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

37
2017-11-15 22:24