Vraag Hoe analyseer en verwerk je HTML / XML in PHP?


Hoe kan men HTML / XML parseren en er informatie uit extraheren?


1894
2017-08-26 17:19


oorsprong


antwoorden:


Native XML-uitbreidingen

Ik gebruik liever een van de native XML-extensies omdat ze gebundeld zijn met PHP, zijn meestal sneller dan alle libs van derden en geven me alle controle die ik nodig heb over de markup.

DOM

Met de DOM-extensie kunt u XML-documenten via de DOM-API met PHP 5 bewerken. Het is een implementatie van het Document Object Model Core Level 3 van het W3C, een platform- en taalneutrale interface waarmee programma's en scripts dynamisch kunnen worden geopend en bijgewerkt. de inhoud, structuur en stijl van documenten.

DOM is in staat om echte (gebroken) HTML-code te ontleden en aan te passen XPath-query's. Het is gebaseerd op libxml.

Het kost wat tijd om productief te worden met DOM, maar die tijd is IMO zeker waard. Omdat DOM een taal-agnostische interface is, vindt u implementaties in vele talen, dus als u uw programmeertaal moet wijzigen, is de kans groot dat u al weet hoe u de DOM-API van die taal moet gebruiken.

Een basisgebruiksvoorbeeld is te vinden in Grijp het href-kenmerk van een A-element en een algemeen conceptueel overzicht is te vinden op DOMDocument in php

Het gebruik van de DOM-extensie is uitvoerig behandeld in StackOverflow, dus als u ervoor kiest om het te gebruiken, kunt u er zeker van zijn dat de meeste problemen die u tegenkomt, kunnen worden opgelost door te zoeken in Stack Overflow.

XMLReader

De XMLReader-extensie is een XML-pull-parser. De lezer fungeert als een cursor in de documentenstroom en stopt onderweg bij elk knooppunt.

XMLReader is, net als DOM, gebaseerd op libxml. Ik weet niet hoe de HTML Parser-module moet worden geactiveerd, dus de kans is groot dat het gebruik van XMLReader voor het parseren van gebroken HTML minder krachtig is dan het gebruik van DOM, waar u expliciet kunt aangeven dat het de HTML Parser-module van libxml moet gebruiken.

Een basisgebruiksvoorbeeld is te vinden op alle waarden van h1-tags ophalen met php

XML Parser

Met deze extensie kunt u XML-parsers maken en vervolgens handlers voor verschillende XML-gebeurtenissen definiëren. Elke XML-parser heeft ook een paar parameters die u kunt aanpassen.

De XML Parser-bibliotheek is ook gebaseerd op libxml en implementeert een SAX stijl XML push-parser. Het kan een betere keuze zijn voor geheugenbeheer dan DOM of SimpleXML, maar zal moeilijker zijn om mee te werken dan de pull-parser geïmplementeerd door XMLReader.

SimpleXML

De SimpleXML-extensie biedt een zeer eenvoudige en gemakkelijk bruikbare toolset om XML te converteren naar een object dat kan worden verwerkt met normale eigenschapselectoren en array-iterators.

SimpleXML is een optie als u weet dat de HTML geldig is XHTML. Als u gebroken HTML wilt parseren, overweeg dan zelfs SimpleXml niet omdat het zal stikken.

Een basisgebruiksvoorbeeld is te vinden op Een eenvoudig programma voor CRUD-knooppunt- en knooppuntwaarden van XML-bestanden en daar is veel extra voorbeelden in de PHP-handleiding.


Bibliotheken van derden (gebaseerd op libxml)

Als u de voorkeur geeft aan een lib van derden, zou ik u aanraden een lib te gebruiken die daadwerkelijk wordt gebruikt DOM/libxml onderaan in plaats van string-parsing.

FluentDom

FluentDOM biedt een jQuery-achtige vloeiende XML-interface voor het DOMDocument in PHP. Selectoren zijn geschreven in XPath of CSS (met behulp van een CSS naar XPath-converter). Huidige versies breiden de DOM-implementerende standaardinterfaces uit en voegen functies toe vanuit de DOM Living Standard. FluentDOM kan formaten zoals JSON, CSV, JsonML, RabbitFish en anderen laden. Kan via Composer worden geïnstalleerd.

HtmlPageDom

Wa72 \ HtmlPageDom` is een PHP-bibliotheek voor eenvoudige manipulatie van HTML   documenten die het gebruiken, vereisen DomCrawler van Symfony2   componenten voor het passeren van de   DOM-structuur en breidt deze uit door methoden toe te voegen voor het manipuleren van de DOM   boom van HTML-documenten.

phpQuery (niet voor jaren bijgewerkt)

phpQuery is een server-side, chainable, CSS3 selector gestuurde Document Object Model (DOM) API op basis van jQuery JavaScript Library geschreven in PHP5 en biedt extra Command Line Interface (CLI).

Zie ook: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom biedt tools voor het werken met DOM-documenten en -structuren. Momenteel bieden we Zend_Dom_Query, dat een uniforme interface biedt voor het opvragen van DOM-documenten met behulp van zowel XPath- als CSS-kiezers.

QueryPath

QueryPath is een PHP-bibliotheek voor het manipuleren van XML en HTML. Het is ontworpen om niet alleen met lokale bestanden te werken, maar ook met webservices en databaseresources. Het implementeert veel van de jQuery-interface (inclusief CSS-stijl selectors), maar het is zwaar afgestemd op gebruik op de server. Kan via Composer worden geïnstalleerd.

fDOMDocument

fDOMDocument breidt de standaard DOM uit om in alle gevallen van fouten uitzonderingen te gebruiken in plaats van PHP-waarschuwingen of -kennisgevingen. Ze voegen ook verschillende aangepaste methoden en snelkoppelingen toe voor het gemak en om het gebruik van DOM te vereenvoudigen.

sabel / xml

saber / xml is een bibliotheek die de klassen XMLReader en XMLWriter omwikkelt en uitbreidt om een ​​eenvoudig "xml naar object / array" toewijzingssysteem en ontwerppatroon te maken. Het schrijven en lezen van XML is single-pass en kan daarom snel zijn en vereist weinig geheugen op grote xml-bestanden.

FluidXML

FluidXML is een PHP-bibliotheek voor het manipuleren van XML met een beknopte en vloeiende API.   Het maakt gebruik van XPath en het vloeiende programmeerpatroon om leuk en effectief te zijn.


3rd-Party (niet op libxml gebaseerd)

Het voordeel van het bouwen op DOM / libxml is dat u uit de doos goede prestaties krijgt, omdat u op een native extensie bent gebaseerd. Echter, niet alle externe libs gaan deze route af. Sommige staan ​​hieronder vermeld

PHP Eenvoudige HTML DOM Parser

  • Een HTML DOM-parser geschreven in PHP5 + laat je HTML op een eenvoudige manier manipuleren!
  • Vereis PHP 5+.
  • Ondersteunt ongeldige HTML.
  • Vind tags op een HTML-pagina met selectors net als jQuery.
  • Haal inhoud uit HTML op één regel.

Over het algemeen raad ik deze parser niet aan. De codebase is vreselijk en de parser zelf is nogal traag en heeft geheugengebrek. Niet alle jQuery-kiezers (zoals kind selectors) zijn mogelijk. Alle bibliotheken op libxml-basis moeten dit gemakkelijk overtreffen.

PHP Html Parser

PHPHtmlParser is een eenvoudige, flexibele HTML-parser waarmee u tags kunt selecteren met elke CSS-selector, zoals jQuery. Het doel is om assistentie te bieden bij de ontwikkeling van tools die een snelle, gemakkelijke manier vereisen om html te verwijderen, ongeacht of deze geldig is of niet! Dit project werd oorspronkelijk ondersteund door sunra / php-simple-html-dom-parser maar de ondersteuning lijkt te zijn gestopt, dus dit project is mijn aanpassing van zijn vorige werk.

Nogmaals, ik zou deze parser niet aanbevelen. Het is vrij langzaam met een hoog CPU-gebruik. Er is ook geen functie om het geheugen van gemaakte DOM-objecten te wissen. Deze problemen schalen met name met geneste lussen. De documentatie zelf is onnauwkeurig en verkeerd gespeld, zonder antwoorden op correcties sinds 14 april 16.

Ganon

  • Een universele tokenizer en HTML / XML / RSS DOM-parser      
    • Mogelijkheid om elementen en hun attributen te manipuleren
    • Ondersteunt ongeldige HTML en UTF8
  • Kan geavanceerde CSS3-achtige query's uitvoeren op elementen (zoals jQuery - naamruimten ondersteund)
  • Een HTML-beautifier (zoals HTML Tidy)      
    • Verklein CSS en Javascript
    • Sorteer attributen, verander karaktergeval, correcte inkeping, enz.
  • uitrekbaar      
    • Documenten parseren met behulp van callbacks op basis van het huidige teken / token
    • Bewerkingen gescheiden in kleinere functies voor eenvoudig overriden
  • Snel en gemakkelijk

Nooit gebruikt. Ik weet niet of het goed is.


HTML 5

U kunt het bovenstaande gebruiken voor het parseren van HTML5, maar er kunnen eigenaardigheden zijn vanwege de markup die HTML5 toestaat. Dus voor HTML5 wilt u overwegen een speciale parser te gebruiken, zoals

html5lib

Een Python- en PHP-implementatie van een HTML-parser op basis van de WHATWG HTML5-specificatie voor maximale compatibiliteit met de belangrijkste desktopwebbrowsers.

Mogelijk zien we meer specifieke parsers zodra HTML5 is voltooid. Er is ook een blogpost bij de titel van de W3 How-To voor html 5-parsing dat is de moeite van het bekijken waard.


Webservices

Als u geen zin heeft om PHP te programmeren, kunt u ook webservices gebruiken. Over het algemeen vond ik hier weinig nut voor, maar dat zijn alleen ik en mijn use-cases.

YQL

Met de YQL-webservice kunnen applicaties gegevens van verschillende bronnen op internet opvragen, filteren en combineren. YQL-instructies hebben een SQL-achtige syntaxis, vertrouwd voor elke ontwikkelaar met database-ervaring.

ScraperWiki.

Met de externe interface van ScraperWiki kunt u gegevens in de vorm die u wilt gebruiken voor gebruik op het web of in uw eigen toepassingen. U kunt ook informatie over de staat van een schraper extraheren.


Normale uitdrukkingen

Laatste en minst aanbevolen, je kunt gegevens uit HTML extraheren met normale uitdrukkingen. Over het algemeen wordt het gebruik van Reguliere expressies op HTML afgeraden.

De meeste fragmenten die u op internet vindt om overeen te komen met markeringen, zijn broos. In de meeste gevallen werken ze alleen voor een heel specifiek stukje HTML. Kleine opmaakwijzigingen, zoals het ergens toevoegen van witruimte of het toevoegen of wijzigen van kenmerken in een tag, kunnen ertoe leiden dat de RegEx mislukt als deze niet correct is geschreven. U moet weten wat u doet voordat u RegEx op HTML gebruikt.

HTML-parsers kennen de syntactische regels van HTML al. Reguliere expressies moeten worden geleerd voor elke nieuwe RegEx die u schrijft. RegEx is in sommige gevallen prima, maar het hangt echt af van uw gebruik-case.

U kan betrouwbaardere parsers schrijven, maar schrijven een compleet en betrouwbaar aangepaste parser met reguliere expressies is tijdverspilling wanneer de bovengenoemde bibliotheken al bestaan ​​en hier een veel betere taak aan leveren.

Zie ook Parsing Html The Cthulhu Way


Boeken

Als je wat geld wilt uitgeven, kijk dan eens naar

Ik ben niet aangesloten bij PHP Architect of de auteurs.


1718
2017-08-26 17:18



Proberen Eenvoudige HTML DOM Parser

  • Een HTML DOM-parser geschreven in PHP 5+ waarmee u HTML op een eenvoudige manier kunt bewerken!
  • Vereis PHP 5+.
  • Ondersteunt ongeldige HTML.
  • Vind tags op een HTML-pagina met selectors net als jQuery.
  • Haal inhoud uit HTML op één regel.
  • Download


Voorbeelden:


HTML-elementen ophalen:

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


Hoe HTML-elementen te wijzigen:

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


Inhoud uit HTML extraheren:

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


Slashdot schrapen:

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



Gebruik gewoon DOMDocument-> loadHTML () en er klaar mee zijn. libxml's HTML-parseeralgoritme is redelijk goed en snel, en in tegenstelling tot wat vaak wordt gedacht, stikt het niet in verkeerd ingedeelde HTML.


224
2017-11-15 22:16



Waarom zou je niet en wanneer je zou moeten gebruik maken van reguliere expressies?

Ten eerste, een veel voorkomende verkeerde benaming: Regexps zijn niet voor "parsing" HTML. Regexes kan echter "extract" gegevens. Extracten is waar ze voor gemaakt zijn. Het grote nadeel van regex HTML-extractie ten opzichte van de juiste SGML-toolkits of baseline XML-parsers is hun syntactische inspanning en variërende betrouwbaarheid.

Bedenk dat het maken van een enigszins betrouwbare HTML-extractieregex:

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

is veel minder leesbaar dan een eenvoudig phpQuery- of QueryPath-equivalent:

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

Er zijn echter specifieke gevallen waarin ze kunnen helpen.

  • Veel front-ends voor DOM-trajecten geven geen HTML-opmerkingen weer <!--, die echter soms de nuttigere ankers voor extractie zijn. In het bijzonder pseudo-HTML-variaties <$var> of SGML-residuen zijn gemakkelijk te temmen met regexps.
  • Regelmatige uitdrukkingen kunnen vaak nabewerking besparen. HTML-entiteiten hebben echter vaak handmatige zorg nodig.
  • En ten slotte, voor eextreem eenvoudige taken zoals het extraheren van <img src = urls, ze zijn in feite een waarschijnlijke tool. Het snelheidsvoordeel ten opzichte van SGML / XML-parsers komt meestal alleen voor deze zeer eenvoudige extractieprocedures.

Het is soms zelfs raadzaam om een ​​HTML-fragment vooraf uit te pakken met behulp van reguliere expressies /<!--CONTENT-->(.+?)<!--END-->/en verwerk de rest met behulp van de eenvoudiger HTML-parser-frontends.

Notitie: Ik heb dit eigenlijk app, waarbij ik XML-parsing en reguliere expressies als alternatief gebruik. Vorige week brak de PyQuery-analyse uit, en de regex werkte nog steeds. Ja, raar, en ik kan het zelf niet uitleggen. Maar zo gebeurde het.
Dus stem alsjeblieft geen realistische overwegingen over, alleen omdat het niet overeenkomt met de regex = slechte meme. Maar laten we ook niet teveel stemmen. Het is slechts een sidenote voor dit onderwerp.


136
2018-05-01 02:04



phpQuery en QueryPath zijn zeer vergelijkbaar in het repliceren van de vloeiende jQuery API. Dat is ook waarom ze twee van de gemakkelijkste benaderingen zijn naar behoren ontleed HTML in PHP.

Voorbeelden voor QueryPath

In principe maakt u eerst een doorzoekbare DOM-structuur van een HTML-tekenreeks:

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

Het resulterende object bevat een volledige boomstructuur van het HTML-document. Het kan worden overgestoken met behulp van DOM-methoden. Maar de gemeenschappelijke aanpak is om CSS selectors te gebruiken zoals in jQuery:

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

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

Meestal wil je eenvoudig gebruiken #id en .class of DIV tag selectors voor ->find(). Maar je kunt ook gebruiken XPath verklaringen, die soms sneller zijn. Ook typische jQuery-methoden zoals ->children() en ->text() en in het bijzonder ->attr() vereenvoudig het uitpakken van de juiste HTML-fragmenten. (En hun SGML-entiteiten zijn al gedecodeerd.)

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

Met QueryPath kunt u ook nieuwe tags in de stream injecteren (->append), en later uitvoer en mooify een bijgewerkt document (->writeHTML). Het kan niet alleen verkeerd ingedeelde HTML ontleden, maar ook verschillende XML-dialecten (met naamruimten) en zelfs gegevens extraheren uit HTML-microformats (XFN, vCard).

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

.

phpQuery of QueryPath?

Over het algemeen is QueryPath beter geschikt voor het manipuleren van documenten. Hoewel phpQuery ook enkele pseudo AJAX-methoden (alleen HTTP-verzoeken) implementeert om meer op jQuery te lijken. Er wordt gezegd dat phpQuery vaak sneller is dan QueryPath (vanwege minder algemene functies).

Zie voor meer informatie over de verschillen deze vergelijking op de terugwegmachine van tagbyte.org. (De originele bron is verdwenen, dus hier is een link naar een internetarchief. Ja, je kunt nog steeds ontbrekende pagina's vinden, mensen.)

En hier is het een uitgebreide introductie van QueryPath.

voordelen

  • Eenvoud en betrouwbaarheid
  • Eenvoudig te gebruiken alternatieven ->find("a img, a object, div a")
  • Juiste gegevens ontrafelen (in vergelijking met reguliere expressie grepping)

126
2017-08-26 17:20



Eenvoudige HTML DOM is een geweldige opensource-parser:

simplehtmldom.sourceforge

Het behandelt DOM-elementen op een objectgerichte manier en de nieuwe iteratie heeft veel dekking voor niet-conforme code. Er zijn ook enkele geweldige functies zoals die je in JavaScript zou zien, zoals de "find" -functie, die alle instanties van elementen van die tag-naam zal retourneren.

Ik heb dit in een aantal hulpprogramma's gebruikt, het op verschillende soorten webpagina's getest en ik denk dat het geweldig werkt.


85
2017-10-04 13:14



Een algemene benadering die ik hier niet heb genoemd is om HTML door te voeren ordelijk, die kan worden ingesteld om gegarandeerde geldige XHTML uit te spuwen. Dan kunt u elke oude XML-bibliotheek erop gebruiken.

Maar voor uw specifieke probleem, zou u dit project moeten bekijken: http://fivefilters.org/content-only/ - het is een aangepaste versie van de Leesbaarheid algoritme, dat is ontworpen om alleen de tekstuele inhoud (geen kop- en voetteksten) van een pagina te extraheren.


58
2017-11-06 21:02