simplexml_load_string - simplexmlelement php ejemplo
¿Cómo se analiza y procesa HTML/XML en PHP? (27)
Alternativas de terceros a SimpleHtmlDom que utilizan DOM en lugar de String Parsing: phpQuery , Zend_Dom , QueryPath y FluentDom .
¿Cómo se puede analizar HTML / XML y extraer información de él?
Puede intentar usar algo como HTML Tidy para limpiar cualquier HTML "roto" y convertir el HTML a XHTML, que puede analizar con un analizador XML.
XML_HTMLSax
es bastante estable, incluso si no se mantiene más. Otra opción podría ser la tubería de HTML a través de Html Tidy y luego analizarlo con las herramientas XML estándar.
Solo usa DOMDocument-> loadHTML () y hazlo con él. El algoritmo de análisis HTML de libxml es bastante bueno y rápido, y al contrario de la creencia popular, no se ahoga en HTML malformado.
Esto se conoce comúnmente como raspado de pantalla , por cierto. La biblioteca que he usado para esto es Simple HTML Dom Parser .
Esto suena como una descripción de la tarea buena de la tecnología W3C XPath . Es fácil expresar consultas como "devolver todos los atributos href
en etiquetas img
que están anidadas en elementos <foo><bar><baz> elements
. No ser un buff de PHP, no puedo decirte en qué forma XPath puede estar disponible. Si puede llamar a un programa externo para procesar el archivo HTML, debería ser capaz de utilizar una versión de línea de comandos de XPath. Para una introducción rápida, vea http://en.wikipedia.org/wiki/XPath .
Un enfoque general que no he visto mencionado aquí es ejecutar HTML a través de Tidy , que se puede configurar para escupir XHTML garantizado-válido. A continuación, puede utilizar cualquier biblioteca XML antigua en él.
Pero a su problema específico, usted debe echar un vistazo a este proyecto: http://fivefilters.org/content-only/ - es una versión modificada del algoritmo Readability , que está diseñado para extraer sólo el contenido textual (no los encabezados y pies de página) de una página.
phpQuery y QueryPath son extremadamente similares al replicar la fluida API jQuery. Ése es también porqué son dos de los acercamientos más fáciles para analizar correctamente el HTML en PHP.
Ejemplos de QueryPath
Básicamente, primero crea un árbol DOM que puede ser consultado desde una cadena HTML:
$qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL
El objeto resultante contiene una representación de árbol completa del documento HTML. Se puede recorrer utilizando métodos DOM. Pero el enfoque común es utilizar selectores CSS como en jQuery:
$qp->find("div.classname")->children()->...;
foreach ($qp->find("p img") as $img) {
print qp($img)->attr("src");
}
En general, desea utilizar los #id
simples #id
y .class
o DIV
para ->find()
. Pero también puede utilizar sentencias XPath , que a veces son más rápidas. También los métodos jQuery típicos como ->children()
y ->text()
y particularmente ->attr()
simplifican la extracción de los fragmentos de HTML correctos. (Y ya tienen sus entidades SGML decodificadas.)
$qp->xpath("//div/p[1]"); // get first paragraph in a div
QueryPath también permite inyectar nuevas etiquetas en el flujo ( ->append
), y más tarde la salida y prettify un documento actualizado ( ->writeHTML
). No sólo puede analizar HTML malformado, sino también varios dialectos XML (con espacios de nombres), e incluso extraer datos de microformatos HTML (XFN, vCard).
$qp->find("a[target=_blank]")->toggleClass("usability-blunder");
.
phpQuery o QueryPath?
Generalmente QueryPath es más adecuado para la manipulación de documentos. Mientras que phpQuery también implementa algunos métodos pseudo AJAX (sólo las solicitudes HTTP) para parecerse más a jQuery. Se dice que phpQuery es a menudo más rápido que QueryPath (debido a menos características generales).
Para más información sobre las diferencias ver esta comparación en la máquina de devolución de tagbyte.org . (La fuente original ha desaparecido, así que aquí hay un enlace de archivo de Internet. Sí, todavía puedes localizar las páginas que faltan, personas.)
Y aquí hay una introducción completa a QueryPath .
Ventajas
- Simplicidad y Confiabilidad
- Alternativas simples de usar
->find("a img, a object, div a")
- Datos correctos unescaping (en comparación con grepping expresión regular)
He escrito un analizador XML de propósito general que puede manejar fácilmente archivos GB. Está basado en XMLReader y es muy fácil de usar:
$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
echo $tag->field1;
echo $tag->field2->subfield1;
}
Aquí está el reporte de github : XmlExtractor
Para 1a y 2: votaría por la nueva clase de componente de Symfony DOMCrawler ( DomCrawler ). Esta clase permite consultas similares a CSS Selectors. Echa un vistazo a esta presentación para ver ejemplos del mundo real: news-of-the-symfony2-world .
El componente está diseñado para funcionar independientemente y puede utilizarse sin Symfony.
El único inconveniente es que sólo funcionará con PHP 5.3 o posterior.
Sí, puedes usar simple_html_dom para el propósito. Sin embargo he trabajado bastante con el simple_html_dom, particularmente para el desguace web y he encontrado que es demasiado vulnerable. Hace el trabajo básico pero no lo recomiendo de todos modos.
Nunca he utilizado curl para el propósito, pero lo que he aprendido es que curl puede hacer el trabajo mucho más eficiente y es mucho más sólido.
Por favor, echa un vistazo a este enlace: scraping-websites-with-curl
Hemos creado bastantes rastreadores para nuestras necesidades antes. Al final del día, por lo general son simples expresiones regulares que hacen lo mejor. Si bien las bibliotecas enumeradas anteriormente son buenas por la razón de su creación, si sabes lo que estás buscando, las expresiones regulares son un camino más seguro, ya que puedes manejar también estructuras HTML / XHTML no válidas, que fallarían si se cargaran a través de la mayoría de los analizadores.
QueryPath es bueno, pero tenga cuidado de "seguimiento del estado" causa si no te das cuenta de lo que significa, puede significar que perder un montón de tiempo de depuración tratando de averiguar qué pasó y por qué el código no funciona.
Lo que significa es que cada llamada en el conjunto de resultados modifica el conjunto de resultados en el objeto, no es encadenable como en jquery donde cada enlace es un nuevo conjunto, usted tiene un solo conjunto que es el resultado de su consulta y cada llamada de función modifica ese conjunto único.
con el fin de obtener jquery-como el comportamiento, es necesario que la sucursal antes de hacer un filtro / modificar como operación, lo que significa que se refleja lo que sucede en jquery mucho más de cerca.
$results = qp("div p");
$forename = $results->find("input[name=''forename'']");
$results
ahora contiene el conjunto de resultados para la input[name=''forename'']
NO la consulta original "div p"
esto me tropezó mucho, lo que encontré fue que QueryPath rastrea los filtros y encuentra y todo lo que modifica sus resultados y tiendas en el objeto. necesitas hacer esto
$forename = $results->branch()->find("input[name=''forname'']")
entonces $results
no serán modificados y puedes reutilizar el conjunto de resultados una y otra vez, tal vez alguien con mucho más conocimiento puede aclarar esto un poco, pero es básicamente así de lo que he encontrado.
Hay varias razones para no analizar HTML mediante la expresión regular. Pero, si usted tiene control total de lo que HTML se generará, entonces usted puede hacer con la expresión regular simple.
Arriba es una función que analiza el HTML por la expresión regular. Tenga en cuenta que esta función es muy sensible y exige que el HTML obedezca ciertas reglas, pero funciona muy bien en muchos escenarios. Si desea un analizador simple y no desea instalar bibliotecas, déle una oportunidad:
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/")));
JSON y matriz de XML en tres líneas:
$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Ta da!
Para HTML5 , html5 lib ha sido abandonada desde hace años. La única biblioteca HTML5 que puedo encontrar con una actualización reciente y los registros de mantenimiento es html5-php, que acaba de llegar a la beta 1.0 hace poco más de una semana.
Pruebe el analizador DOM simple de DOM
- Un analizador DOM HTML escrito en PHP 5 + que le permite manipular HTML de una manera muy fácil!
- Requiere PHP 5+.
- Soporta HTML no válido.
- Buscar etiquetas en una página HTML con selectores como jQuery.
- Extraer contenido de HTML en una sola línea.
- Descargar
Ejemplos:
Cómo obtener elementos 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>'';
Cómo modificar elementos 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;
Extraer contenido de HTML:
// Dump contents (without tags) from HTML
echo file_get_html(''http://www.google.com/'')->plaintext;
Raspado 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);
Recomiendo PHP Simple HTML DOM Parser .
Realmente tiene buenas características, como:
foreach($html->find(''img'') as $element)
echo $element->src . ''<br>'';
Simple HTML DOM es un gran analizador de código abierto:
Trata los elementos DOM de una manera orientada a objetos, y la nueva iteración tiene mucha cobertura para el código no conforme. También hay algunas funciones excelentes como las que verías en JavaScript, como la función "find", que devolverá todas las instancias de elementos de ese nombre de etiqueta.
He utilizado esto en una serie de herramientas, probarlo en muchos tipos diferentes de páginas web, y creo que funciona muy bien.
Advanced Html Dom es un reemplazo HTML DOM simple que ofrece la misma interfaz, pero está basado en DOM, lo que significa que no ocurre ninguno de los problemas de memoria asociados.
También tiene soporte completo de CSS, incluyendo extensiones jQuery .
Hay muchas maneras de procesar HTML / XML DOM de los cuales la mayoría ya han sido mencionados. Por lo tanto, no haré ningún intento de enumerar los míos.
Simplemente quiero añadir que personalmente prefiero usar la extensión DOM y por qué:
- iit hace uso óptimo de la ventaja de rendimiento del código C subyacente
- es OO PHP (y me permite subclase)
- es un nivel bastante bajo (que me permite usarlo como una base no hinchada para un comportamiento más avanzado)
- proporciona acceso a todas las partes del DOM (a diferencia de, por ejemplo, SimpleXml, que ignora algunas de las características XML menos conocidas)
- tiene una sintaxis utilizada para el rastreo DOM que es similar a la sintaxis utilizada en Javascript nativo.
Y aunque extraño la capacidad de utilizar selectores CSS para DOMDocument
, existe una manera bastante sencilla y conveniente de agregar esta característica: subclasificar el DOMDocument
y agregar métodos JS-like querySelectorAll
y querySelector
a su subclase.
Para analizar los selectores, recomiendo usar el componente CssSelector muy minimalista del framework Symfony . Este componente sólo traduce selectores CSS a selectores XPath, que pueden ser alimentados a un DOMXpath
para recuperar el Nodelist correspondiente.
A continuación, puede utilizar esta subclase (aún de nivel muy bajo) como una base para más clases de alto nivel, destinado a eg. analizar tipos muy específicos de XML o añadir más comportamiento similar a jQuery.
El código siguiente viene directamente a mi biblioteca DOM-Query y utiliza la técnica que he descrito.
Para el análisis HTML:
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);
}
}
}
}
[...]
}
Consulte también Análisis de documentos XML con selectores CSS por el creador de Symfony, Fabien Potencier, sobre su decisión de crear el componente CssSelector para Symfony y cómo usarlo.
He creado una biblioteca llamada PHPPowertools / DOM-Query , que le permite rastrear documentos HTML5 y XML como lo hace con jQuery.
Bajo el capó, utiliza symfony / DomCrawler para la conversión de selectores CSS a selectores XPath . Siempre utiliza el mismo DomDocument, incluso al pasar un objeto a otro, para asegurar un rendimiento decente.
Ejemplo de uso:
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>'');
[...]
Métodos soportados:
- [x] $ (1)
- [x] $ .parseHTML
- [x] $ .parseXML
- [x] $ .parseJSON
- [x] $ selection.add
- [x] $ selection.addClass
- [x] $ selection.after
- [x] $ selection.append
- [x] $ selection.attr
- [x] $ selection.before
- [x] $ selection.children
- [x] $ selection.closest
- [x] $ selection.contents
- [x] $ selection.detach
- [x] $ selection.each
- [x] $ selection.eq
- [x] $ selection.empty (2)
- [x] $ selection.find
- [x] $ selection.first
- [x] $ selection.get
- [x] $ selection.insertAfter
- [x] $ selection.insertBefore
- [x] $ selection.last
- [x] $ selection.parent
- [x] $ selection.parents
- [x] $ selection.remove
- [x] $ selection.removeAttr
- [x] $ selection.removeClass
- [x] $ selection.text
- [x] $ selection.wrap
- Renombrado ''select'', por razones obvias
- Renombrado ''void'', ya que ''empty'' es una palabra reservada en PHP
NOTA :
La biblioteca también incluye su propio autocargador de configuración cero para bibliotecas compatibles con PSR-0. El ejemplo incluido debe funcionar fuera de la caja sin ninguna configuración adicional. Alternativamente, puedes usarlo con el compositor.
Con FluidXML puede consultar e iterar XML utilizando XPath y CSS Selectors .
$doc = fluidxml(''<html>...</html>'');
$title = $doc->query(''//head/title'')[0]->nodeValue;
$doc->query(''//body/p'', ''div.active'', ''#bgId'')
->each(function($i, $node) {
// $node is a DOMNode.
$tag = $node->nodeName;
$text = $node->nodeValue;
$class = $node->getAttribute(''class'');
});
¿Por qué no debería y cuándo debe usar expresiones regulares?
Primero apagado, un misnomer común: Los Regexps no son para el " parsing " HTML. Regexes sin embargo puede " extraer " los datos. La extracción es para lo que están hechos. El principal inconveniente de la extracción de HTML de regex sobre los kits de herramientas SGML o los analizadores XML de línea de base son su esfuerzo sintáctico y confiabilidad variable.
Considere la posibilidad de hacer una regex de extracción HTML bastante confiable:
<a/s+class="?playbutton/d?[^>]+id="(/d+)".+? <a/s+class="[/w/s]*title
[/w/s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?
es mucho menos legible que un simple phpQuery o QueryPath equivalente:
$div->find(".stationcool a")->attr("title");
Sin embargo, hay casos de uso específicos en los que pueden ayudar.
- Muchos frontales de DOM traversal no revelan comentarios HTML
<!--
, que sin embargo son a veces los anclajes más útiles para la extracción. En particular, las variaciones pseudo-HTML<$var>
o los residuos SGML son fáciles de domesticar con regexps. - A menudo, las expresiones regulares pueden ahorrar post-procesamiento. Sin embargo entidades HTML a menudo requieren cuidado manual.
- Y por último, para tareas sencillas como extraer <img src = urls, son de hecho una herramienta probable. La ventaja de la velocidad sobre los analizadores SGML / XML, en su mayoría sólo viene a jugar para estos procedimientos de extracción muy básicos.
A veces incluso es aconsejable pre-extraer un fragmento de HTML utilizando expresiones regulares /<!--CONTENT-->(.+?)<!--END-->/
y procesar el resto utilizando los /<!--CONTENT-->(.+?)<!--END-->/
analizador de HTML más simples.
Nota: Tengo realmente esta aplicación , donde empleo el análisis XML y las expresiones regulares alternativamente. La semana pasada, el análisis de PyQuery se rompió, y el regex aún funcionaba. Sí extraño, y no puedo explicarlo yo mismo. Pero así sucedió.
Así que por favor no vote las consideraciones del mundo real abajo, sólo porque no coincide con el meme regex = mal. Pero tampoco vamos a votar demasiado. Es sólo un comentario para este tema.
Extensiones XML nativas
Yo prefiero usar una de las extensiones XML nativas ya que vienen con PHP, suelen ser más rápidas que todas las librerías de terceros y me dan todo el control que necesito sobre el marcado.
DOM
La extensión DOM le permite operar en documentos XML a través de la API DOM con PHP 5. Es una implementación del Modelo de Objetos de Documento de W3C Nivel 3, una plataforma y lenguaje neutral interfaz que permite a los programas y scripts acceder dinámicamente y actualizar el contenido, la estructura y el estilo de los documentos.
DOM es capaz de analizar y modificar el mundo real (roto) HTML y puede hacer consultas XPath . Se basa en libxml .
Lleva algún tiempo ser productivo con DOM, pero ese tiempo vale la pena IMO. Dado que DOM es una interfaz agnóstica del lenguaje, encontrará implementaciones en muchos idiomas, por lo que si necesita cambiar su lenguaje de programación, es probable que ya sepa usar la API DOM de ese idioma.
Un ejemplo de uso básico se puede encontrar en Grabbing el atributo href de un elemento A y se puede encontrar una descripción conceptual general en DOMDocument en php
Cómo utilizar la extensión DOM ha sido ampliamente cubierto en , por lo que si decide utilizarlo, puede estar seguro de que la mayoría de los problemas que se pueden encontrar se pueden resolver mediante la búsqueda / navegación de desbordamiento de pila.
XMLReader
La extensión XMLReader es un analizador de tracción XML. El lector actúa como un cursor avanzando en el flujo de documentos y deteniéndose en cada nodo en el camino.
XMLReader, como DOM, se basa en libxml. No soy consciente de cómo activar el módulo de analizador de HTML, por lo que es probable que el uso de XMLReader para analizar el HTML roto podría ser menos robusto que utilizar DOM donde se puede explícitamente decirle que utilice el módulo de análisis HTML de libxml.
Un ejemplo de uso básico se puede encontrar en obtener todos los valores de etiquetas h1 usando php
Analizador de XML
Esta extensión le permite crear analizadores XML y luego definir manejadores para diferentes eventos XML. Cada analizador XML también tiene algunos parámetros que puede ajustar.
La biblioteca de XML Parser también se basa en libxml, e implementa un XML de estilo SAX XML parser. Puede ser una mejor opción para la administración de memoria que DOM o SimpleXML, pero será más difícil trabajar con el analizador de trazo implementado por XMLReader.
SimpleXml
La extensión SimpleXML proporciona un conjunto de herramientas muy sencillo y fácilmente utilizable para convertir XML a un objeto que se puede procesar con selectores de propiedades normales e iteradores de array.
SimpleXML es una opción cuando se sabe que el HTML es XHTML válido. Si necesita analizar HTML roto, ni siquiera considere SimpleXml porque se ahogará.
Un ejemplo de uso básico se puede encontrar en un programa simple para CRUD nodo y valores de nodo de archivo xml y hay muchos ejemplos adicionales en el Manual de PHP .
Bibliotecas de terceros (basadas en libxml)
Si prefieres usar una biblioteca de terceros, sugeriría usar una lib que utilice DOM / libxml debajo en lugar de analizar las cadenas.
FluentDom
FluentDOM proporciona una interfaz XML fluida similar a jQuery para el DOMDocument en PHP. Los selectores se escriben en XPath o CSS (utilizando un convertidor CSS a XPath). Las versiones actuales amplían el DOM implementando interfaces estándar y añadiendo características del DOM Living Standard. FluentDOM puede cargar formatos como JSON, CSV, JsonML, RabbitFish y otros. Se puede instalar a través de Composer.
HtmlPageDom
Wa72 / HtmlPageDom` es una biblioteca de PHP para la manipulación fácil de documentos HTML usando Se requiere DomCrawler de Symfony2 componentes para recorrer el árbol DOM y se extiende mediante la adición de métodos para manipular el árbol DOM de documentos HTML.
phpQuery (no actualizado hace años)
phpQuery es una API DOM (Document Object Model) orientada al selector CSS3, basada en el servidor, basada en jQuery JavaScript Library escrita en PHP5 y que proporciona una interfaz de línea de comandos (CLI) adicional.
Consulte también: https://github.com/electrolinux/phpquery
Zend_Dom
Zend_Dom proporciona herramientas para trabajar con documentos y estructuras DOM. Actualmente, ofrecemos Zend_Dom_Query, que proporciona una interfaz unificada para consultar documentos DOM utilizando tanto selectores XPath como CSS.
QueryPath
QueryPath es una biblioteca de PHP para manipular XML y HTML. Está diseñado para trabajar no sólo con archivos locales, sino también con servicios web y recursos de base de datos. Implementa gran parte de la interfaz jQuery (incluyendo selectores de estilo CSS), pero está muy ajustado para el uso en el servidor. Se puede instalar a través de Composer.
documento fDOM
fDOMDocument extiende el DOM estándar para usar excepciones en todas las ocasiones de errores en lugar de avisos o avisos de PHP. También agregan varios métodos y atajos de encargo para la conveniencia y para simplificar el uso de DOM.
sable xml
sabre / xml es una biblioteca que envuelve y extiende las clases XMLReader y XMLWriter para crear un simple sistema de mapeo "xml to object / array" y patrón de diseño. Escritura y lectura XML es de paso único y por lo tanto puede ser rápido y requieren poca memoria en archivos xml grandes.
FluidXML
FluidXML es una biblioteca de PHP para manipular XML con una API concisa y fluida. Aprovecha XPath y el patrón de programación fluida para ser divertido y eficaz.
Tercero (no basado en libxml)
El beneficio de construir sobre DOM / libxml es que obtiene un buen rendimiento fuera de la caja porque se basa en una extensión nativa. Sin embargo, no todas las librerías de terceros siguen esta ruta. Algunos de ellos se enumeran a continuación
PHP Simple HTML DOM Parser
- Un analizador de DOM HTML escrito en PHP5 + le permite manipular HTML de una manera muy fácil!
- Requiere PHP 5+.
- Soporta HTML no válido.
- Buscar etiquetas en una página HTML con selectores como jQuery.
- Extraer contenido de HTML en una sola línea.
Por lo general, no recomiendo este analizador. El codebase es horrible y el analizador en sí es bastante lento y memoria hambre. No todos los selectores jQuery (como los selectores de niños ) son posibles. Cualquiera de las bibliotecas basadas en libxml debería superar esto fácilmente.
PHP Html Parser
PHPHtmlParser es un simple, flexible, analizador html que le permite seleccionar las etiquetas con cualquier selector css, como jQuery. El objetivo es asistir en el desarrollo de herramientas que requieren una forma rápida y fácil de desechar html, si es válido o no! Este proyecto fue original soportado por sunra / php-simple-html-dom-parser pero el soporte parece haberse detenido por lo que este proyecto es mi adaptación de su trabajo anterior.
Una vez más, no recomendaría este analizador. Es bastante lento con un alto uso de la CPU. También no hay ninguna función para borrar la memoria de los objetos DOM creados. Estos problemas varían particularmente con bucles anidados. La documentación en sí es inexacta y mal escrita, sin respuestas a las correcciones desde 14 de abril 16.
Ganon
- Un tokenizador universal y un analizador DOM / XML / XML DOM
- Capacidad para manipular elementos y sus atributos
- Soporta HTML y UTF8 no válidos
- Puede realizar consultas avanzadas de tipo CSS3 en elementos (como jQuery - espacios de nombres soportados)
- Un embellecedor de HTML (como HTML Tidy)
- Minify CSS y Javascript
- Ordena los atributos, cambia el carácter de la casilla, la sangría correcta, etc.
- Extensible
- Analizar documentos utilizando devoluciones de llamada basadas en el carácter / símbolo actual
- Operaciones separadas en funciones más pequeñas para una fácil sustitución
- Rapido y facil
Nunca lo usé. No puedo decir si es bueno.
HTML 5
Puede utilizar lo anterior para analizar HTML5, pero puede haber peculiaridades debido a la marcación HTML5 permite. Así que para HTML5 que desea considerar el uso de un analizador dedicado, como
Un Python y PHP implementaciones de un analizador HTML basado en la especificación WHATWG HTML5 para máxima compatibilidad con los principales navegadores web de escritorio.
Podríamos ver más analizadores dedicados una vez finalizado HTML5. También hay un blogpost por el W3 titulado How-To para el análisis de html 5 que vale la pena echar un vistazo.
Servicios web
Si no te apetece programar PHP, también puedes usar servicios web. En general, encontré muy poca utilidad para estos, pero eso es sólo yo y mis casos de uso.
YQL
El servicio Web de YQL permite a las aplicaciones consultar, filtrar y combinar datos de diferentes fuentes a través de Internet. Las sentencias YQL tienen una sintaxis similar a SQL, familiar para cualquier desarrollador con experiencia en bases de datos.
ScraperWiki .
La interfaz externa de ScraperWiki le permite extraer datos en la forma que desea para su uso en la web o en sus propias aplicaciones. También puede extraer información sobre el estado de cualquier rascador.
Expresiones regulares
Último y menos recomendado , puede extraer datos de HTML con expresiones regulares . En general, el uso de expresiones regulares en HTML se desaconseja.
La mayoría de los fragmentos que encontrará en la web para coincidir con los márgenes son frágiles. En la mayoría de los casos sólo están trabajando para una pieza muy particular de HTML. Cambios de marcado minúsculos, como agregar espacios en blanco en algún lugar o añadir o cambiar atributos en una etiqueta, pueden hacer que la expresión regular falla cuando no está escrita correctamente. Usted debe saber lo que está haciendo antes de usar regex en HTML.
Los analizadores de HTML ya conocen las reglas sintácticas de HTML. Las expresiones regulares tienen que ser enseñadas para cada nueva expresión regular que escribas. Regex está bien en algunos casos, pero realmente depende de su caso de uso.
Puede escribir analizadores más fiables , pero escribir un analizador personalizado completo y fiable con expresiones regulares es una pérdida de tiempo cuando las bibliotecas mencionadas ya existen y hacer un trabajo mucho mejor en esto.
Véase también Parsing Html The Cthulhu Way
Libros
Si quieres gastar algo de dinero, echa un vistazo a
No estoy afiliado con PHP Architect ni con los autores.