Maison  >  Article  >  développement back-end  >  Comment utiliser DOMDocument en PHP pour traiter des documents HTML et XML

Comment utiliser DOMDocument en PHP pour traiter des documents HTML et XML

藏色散人
藏色散人avant
2021-03-16 17:57:564703parcourir

Utilisez DOMDocument en PHP pour traiter des documents HTML et XML

En fait, à partir de PHP5, PHP nous a fourni une classe puissante pour analyser et générer des opérations liées au XML , qui est la classe DOMDocument dont nous allons parler aujourd'hui. Cependant, j'estime que la plupart des gens aimeront toujours utiliser des expressions régulières pour analyser le contenu Web lors de l'exploration de pages Web. Après avoir appris ce cours aujourd'hui, vous pourrez essayer d'utiliser la propre méthode d'analyse de PHP la prochaine fois.

Analyse HTML

// 解析 HTML
$baidu = file_get_contents('https://www.baidu.com');

$doc = new DOMDocument();
@$doc->loadHTML($baidu);

// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);

// object(DOMElement)#2 
//     ....

echo $inputSearch->getAttribute('name'), PHP_EOL; // wd

// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
    $allImageLinks[] = $img->getAttribute('src');
}

print_r($allImageLinks);

// Array
// (
//     [0] => //www.baidu.com/img/baidu_jgylogo3.gif
//     [1] => //www.baidu.com/img/bd_logo.png
//     [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )

// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
    print_r(parse_url($link));
}

// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/bd_logo.png
// )
// Array
// (
//     [scheme] => http
//     [host] => s1.bdstatic.com
//     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )

Cela ne semble-t-il pas si clair et orienté objet ? C'est comme utiliser la bibliothèque ORM pour les opérations de base de données pour la première fois. Regardons-le pièce par pièce.

$baidu = file_get_contents('https://www.baidu.com');

$doc = new DOMDocument();
@$doc->loadHTML($baidu);

La première consiste à charger le contenu du document. C'est plus facile à comprendre. Utilisez la méthode loadHTML() directement pour charger le contenu HTML. Il fournit également plusieurs autres méthodes, à savoir : load() charge du XML à partir d'un fichier ; loadXML() charge du XML à partir d'une chaîne ; loadHTMLFile() charge du HTML à partir d'un fichier ;

// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);

// object(DOMElement)#2 
//     ....

echo $inputSearch->getAttribute('name'), PHP_EOL; // wd

Ensuite, nous utilisons la même API de manipulation DOM que JS front-end pour manipuler des éléments en HTML. Dans cet exemple, vous obtenez la zone de texte de Baidu et utilisez directement la méthode getElementById() pour obtenir l'objet DOMElement avec l'identifiant comme contenu spécifié. Ensuite, vous pouvez obtenir ses valeurs, attributs, etc.

[Recommandations associées : Tutoriel vidéo PHP]

// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
    $allImageLinks[] = $img->getAttribute('src');
}

print_r($allImageLinks);

// Array
// (
//     [0] => //www.baidu.com/img/baidu_jgylogo3.gif
//     [1] => //www.baidu.com/img/bd_logo.png
//     [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )

// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
    print_r(parse_url($link));
}

// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/bd_logo.png
// )
// Array
// (
//     [scheme] => http
//     [host] => s1.bdstatic.com
//     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )

Cet exemple permet d'obtenir tous les liens d'image dans le document HTML. Comparé aux expressions régulières, c'est beaucoup plus pratique et le code lui-même est explicite, il n'est donc pas nécessaire de considérer le problème de l'échec de la correspondance régulière. En coopérant avec une autre méthode parse_url() fournie avec PHP, vous pouvez également analyser le lien très facilement et extraire le contenu souhaité.

L'analyse de XML est similaire à l'analyse de HTML. Les deux peuvent être facilement analysées à l'aide de l'interface de méthode fournie par DOMDocument et DOMElement. Alors que voulons-nous générer un format standard de XML ? Bien sûr, c'est également très simple. Il n'est pas nécessaire de fusionner des chaînes. Vous pouvez utiliser cette classe pour effectuer des opérations basées sur des objets.

Générer un XML

// 生成一个XML文档
$xml = new DOMDocument('1.0', 'UTF-8');

$node1 = $xml->createElement('First', 'This is First Node.');
$node1->setAttribute('type', '1');

$node2 = $xml->createElement('Second');
$node2->setAttribute('type', '2');
$node2_child = $xml->createElement('Second-Child', 'This is Second Node Child.');
$node2->appendChild($node2_child);

$xml->appendChild($node1);
$xml->appendChild($node2);
print $xml->saveXML();

/*
930406f08da8ee4a2ff134b688d29d1d
80d0a44fb52501b45210d19567744c44This is First Node.02ef1716f0c25a19a37dfb5f194429ec
51072466d8dba7b78b124cb14fb072b50e06ead6eda9a04ee89f206a4868bdd8This is Second Node Child.a031e6b623a487c16282de8e8361d440e6d0d204f222d3c70ad56d061fe9b19f
*/

En fait, tant que vous avez un peu de base JS front-end, il n'est pas difficile de voir le sens de ce code. Utilisez la méthode createElement() pour créer un objet DOMElement, puis ajoutez-y des propriétés et du contenu. Utilisez la méthode appendChild() pour ajouter des nœuds subordonnés au DOMElement ou DOMDocument actuel. Enfin, utilisez saveXML() pour générer du contenu au format XML standard.

Résumé

À travers les deux exemples simples ci-dessus, je pense que tout le monde est déjà très intéressé par la façon dont ce DOMDocument exploite l'analyse des fichiers de classe XML. Cependant, il n'existe aucun test pertinent sur la différence entre leurs performances et la méthode d'analyse classique. Cependant, dans des circonstances normales, le document HMTL du site Web ne sera pas trop volumineux. Après tout, chaque site Web prendra également en compte sa propre vitesse de chargement. .Si le document S'il est très volumineux, l'expérience utilisateur sera médiocre, il n'y a donc fondamentalement aucun problème à utiliser cet ensemble d'interfaces pour l'analyse et le traitement quotidiens des robots.

Code du test :

https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/PHP%E4%B8%AD%E4%BD%BF%E7%94%A8DOMDocument%E6%9D%A5%E5%A4%84%E7%90%86HTML%E3%80%81XML%E6%96%87%E6%A1%A3.php

Document de référence :
https://www.php.net/manual/zh/class.domdocument.php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer