2217 votes

Comment analyser et de traitement de HTML/XML en PHP?

Comment peut-on analyser HTML/XML et d'en extraire les informations?

C'est une Référence Générale à la question de l' tag

335voto

NAVEED Points 16576

Essayez Simple HTML Dom Parser

  • Un HTML DOM parser écrit en PHP5+ vous permettent de manipuler le code HTML dans une manière très facile!
  • Nécessite PHP 5+.
  • Prend en charge HTML non valide.
  • Trouver les étiquettes sur une page HTML avec les sélecteurs comme jQuery.
  • Extraire le contenu HTML dans une seule ligne.
  • Télécharger


Exemples:

Comment obtenir des éléments 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>';


Comment modifier les éléments 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;


Extraire le contenu de HTML:

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


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

244voto

Edward Z. Yang Points 13760

Utilisez simplement DOMDocument->loadHTML() et être fait avec elle. libxml HTML de l'algorithme d'analyse est très bonne et rapide, et contrairement à la croyance populaire, n'étouffe pas sur du code HTML mal formé.

153voto

mario Points 76989

Pourquoi vous ne devriez pas, et quand vous devriez utiliser les expressions régulières?

Tout d'abord, le HTML ne peut pas être correctement analysée à l'aide d'expressions régulières. Regexes peut cependant extraire des données. L'extraction est ce qu'ils sont faits pour. L'inconvénient majeur de regex HTML extraction plus approprié de SGML boîtes à outils de base ou de parseurs XML sont leurs syntaxique des lourdeurs et maigre fiabilité.

Considérer que faire un peu fiable HTML extraction de la regex:

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

est beaucoup moins lisible qu'un simple phpQuery ou QueryPath équivalent:

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

Il y a cependant des cas d'utilisation spécifiques où ils peuvent aider. La plupart des parseurs XML ne peut pas voir document HTML commentaires <!-- qui parfois, cependant, sont plus utiles, les points d'ancrage pour l'extraction des fins. Parfois les expressions régulières peuvent enregistrer le post-traitement. Et enfin, pour les très simples tâches comme l'extraction d' <img src= url, ils sont en fait une probable outil. L'avantage de vitesse sur SGML/XML analyseurs surtout vient juste de jouer pour ces très de base, les procédures d'extraction.

Il est parfois conseillé de pré-extrait d'un extrait de code HTML à l'aide d'expressions régulières /<!--CONTENT-->(.+?)<!--END-->/ processus et le reste à l'aide de la plus simple analyseur HTML méthodes.

Remarque: en fait, j'ai cette application, où j'emploie d'analyse XML et les expressions régulières alternativement. Juste la semaine dernière, le PyQuery l'analyse a éclaté, et la regex encore travaillé. Oui bizarre, et je ne peux pas l'expliquer moi-même. Mais c'est arrivé.
Donc merci de ne pas voter dans le monde réel des considérations de bas, juste parce qu'il ne correspond pas à la regex=mal mème. Mais n'oublions pas de vote, c'est trop. C'est juste une note pour ce sujet.

135voto

mario Points 76989

phpQuery et QueryPath sont très similaires dans la réplication, la fluidité de jQuery API. C'est aussi pourquoi ils sont deux, la plus simple des approches pour correctement analyser HTML en PHP.

Exemples pour QueryPath

En gros, vous créez d'abord un queryable arborescence du DOM à partir d'une chaîne HTML:

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

L'objet résultant contient une arborescence complète de la représentation du document HTML. Il peut être parcouru à l'aide de méthodes du DOM. Mais l'approche la plus répandue consiste à utiliser les sélecteurs CSS, comme en jQuery:

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

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

Surtout, vous voulez utiliser simple #id et .class ou DIV des sélecteurs de balise pour ->find(). Mais vous pouvez également utiliser XPath états, qui, parfois, sont plus rapides. Typique, les méthodes jQuery comme ->children() et ->text() et particulièrement ->attr() simplifier l'extraction du droit des extraits de code HTML. (Et ont déjà leur SGML entités décodées.)

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

QueryPath permet aussi d'injecter de nouvelles balises dans le flux (->append), et, plus tard, de sortie et d'embellir un document mis à jour (->writeHTML). Il ne peut pas analyser uniquement du code HTML mal formé, mais aussi de divers dialectes XML (avec les espaces de noms), et même d'extraire des données à partir de HTML microformats (XFN, vCard).

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

.

phpQuery ou QueryPath?

Généralement QueryPath est mieux adapté pour la manipulation des documents. Alors que phpQuery met également en œuvre des pseudo-méthodes AJAX (juste les requêtes HTTP) ressemblent plus à jQuery. Il est dit que phpQuery est souvent plus rapide que QueryPath (en raison de moins de fonctionnalités).

Pour de plus amples informations sur les différences de voir cette comparaison sur la wayback machine de tagbyte.org. (Source d'origine a disparu, voici donc internet archive link. Oui, vous pouvez toujours trouver les pages manquantes, les gens.)

Et voici une complète QueryPath introduction.

Avantages

  • La simplicité et la Fiabilité
  • Simple d'utiliser les alternatives ->find("a img, a object, div a")
  • Bon de données unescaping (en comparaison avec l'expression régulière grepping)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X