Tatsächlich hat uns PHP ab PHP5 eine leistungsstarke Klasse zum Parsen und Generieren von XML-bezogenen Vorgängen zur Verfügung gestellt, nämlich die DOMDocument-Klasse, die wir verwenden werden über heute reden. Ich schätze jedoch, dass die meisten Leute beim Crawlen von Webseiten immer noch gerne reguläre Ausdrücke zum Parsen von Webinhalten verwenden werden. Nachdem Sie diesen Kurs heute gelernt haben, können Sie beim nächsten Mal versuchen, die PHP-eigene Methode zum Parsen und Analysieren zu verwenden.
HTML parsen
// 解析 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 // )
Fühlt es sich nicht so klar und objektorientiert an? Es fühlt sich an, als würde man die ORM-Bibliothek zum ersten Mal für Datenbankoperationen verwenden. Schauen wir es uns Stück für Stück an.
$baidu = file_get_contents('https://www.baidu.com'); $doc = new DOMDocument(); @$doc->loadHTML($baidu);
Der erste Schritt besteht darin, den Dokumentinhalt zu laden. Dies ist einfacher zu verstehen. Verwenden Sie die Methode „loadHTML()“, um den HTML-Inhalt direkt zu laden. Es bietet auch mehrere andere Methoden, nämlich: Load() lädt XML aus einer Datei; LoadXML() lädt XML aus einer Zeichenfolge; LoadHTMLFile() lädt HTML aus einer Datei.
// 百度输出框 $inputSearch = $doc->getElementById('kw'); var_dump($inputSearch); // object(DOMElement)#2 // .... echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
Als nächstes verwenden wir dieselbe DOM-Manipulations-API wie Front-End-JS, um Elemente in HTML zu manipulieren. In diesem Beispiel erhalten Sie das Textfeld von Baidu und verwenden direkt die Methode getElementById(), um das DOMElement-Objekt mit der ID als angegebenen Inhalt abzurufen. Dann können Sie seine Werte, Attribute usw. abrufen.
【Verwandte Empfehlung: PHP-Video-Tutorial】
// 获取所有图片的链接 $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 // )
Dieses Beispiel dient dazu, alle Bildlinks im HTML-Dokument abzurufen. Im Vergleich zu regulären Ausdrücken ist es viel praktischer und der Code selbst ist selbsterklärend, sodass das Problem des regulären Matching-Fehlers nicht berücksichtigt werden muss. Durch die Zusammenarbeit mit einer anderen parse_url()-Methode, die mit PHP geliefert wird, können Sie den Link auch sehr bequem analysieren und den gewünschten Inhalt extrahieren.
Das Parsen von XML ähnelt dem Parsen von HTML. Beide können mithilfe der von DOMDocument und DOMElement bereitgestellten Methodenschnittstelle problemlos analysiert werden. Was wollen wir also als XML-Standardformat generieren? Natürlich ist es auch sehr einfach, Zeichenfolgen zu verbinden. Sie können diese Klasse verwenden, um objektbasierte Operationen auszuführen.
Generieren Sie ein 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 */
Solange Sie über ein wenig Front-End-JS-Grundlagen verfügen, ist es tatsächlich nicht schwer, die Bedeutung dieses Codes zu erkennen. Verwenden Sie die Methode createElement(), um ein DOMElement-Objekt zu erstellen und ihm dann Eigenschaften und Inhalte hinzuzufügen. Verwenden Sie die Methode appendChild(), um untergeordnete Knoten zum aktuellen DOMElement oder DOMDocument hinzuzufügen. Verwenden Sie schließlich saveXML(), um Inhalte im Standard-XML-Format zu generieren.
Zusammenfassung
Anhand der beiden oben genannten einfachen Beispiele glaube ich, dass jeder sehr daran interessiert ist, wie dieses DOMDocument das Parsen von XML-Klassendateien durchführt. Es gibt jedoch keinen relevanten Test, wie unterschiedlich ihre Leistung im Vergleich zur regulären Parsing-Methode ist. Unter normalen Umständen wird das HTML-Dokument der Website jedoch nicht zu groß sein. Schließlich berücksichtigt jede Website auch ihre eigene Ladegeschwindigkeit Wenn das Dokument sehr groß ist, ist die Benutzererfahrung schlecht, sodass die Verwendung dieser Schnittstellen für die tägliche Crawler-Analyse und -Verarbeitung grundsätzlich kein Problem darstellt.
Testcode:
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
Referenzdokument:
https://www.php.net/manual/zh/class.domdocument.php