> 백엔드 개발 > PHP 튜토리얼 > PHP에서 DOMDocument를 사용하여 HTML 및 XML 문서를 처리하는 방법

PHP에서 DOMDocument를 사용하여 HTML 및 XML 문서를 처리하는 방법

藏色散人
풀어 주다: 2023-04-09 20:10:02
앞으로
4784명이 탐색했습니다.

DOMDocument는 PHP에서 HTML 및 XML 문서를 처리하는 데 사용됩니다.

실제로 PHP5부터 PHP는 XML 관련 작업을 구문 분석하고 생성하기 위한 강력한 클래스를 제공했는데, 이것이 바로 DOMDocument 클래스입니다. 오늘 얘기해요. 그러나 나는 대부분의 사람들이 여전히 웹 페이지를 크롤링할 때 웹 콘텐츠를 구문 분석하기 위해 정규 표현식을 사용하고 싶어할 것이라고 추정합니다. 오늘 이 수업을 배운 후에는 다음번에는 구문 분석 및 분석을 위해 PHP 고유의 방법을 사용해 볼 수 있습니다.

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
// )
로그인 후 복사

너무 명확하고 객체지향적인 느낌이 들지 않나요? 처음으로 데이터베이스 작업에 ORM 라이브러리를 사용하는 것과 같은 느낌입니다. 하나씩 살펴보겠습니다.

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

$doc = new DOMDocument();
@$doc->loadHTML($baidu);
로그인 후 복사

첫 번째 단계는 문서 콘텐츠를 로드하는 것입니다. HTML 콘텐츠를 직접 로드하려면 loadHTML() 메서드를 사용하는 것이 더 쉽습니다. 또한 load()는 파일에서 XML을 로드하고, loadXML()은 문자열에서 XML을 로드하며, loadHTMLFile()은 파일에서 HTML을 로드합니다.

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

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

echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
로그인 후 복사

다음으로 프론트엔드 JS와 동일한 DOM 조작 API를 사용하여 HTML의 요소를 조작합니다. 이 예에서는 Baidu의 텍스트 상자를 가져오고 getElementById() 메서드를 직접 사용하여 ID가 ​​지정된 콘텐츠인 DOMElement 객체를 가져옵니다. 그런 다음 해당 값, 속성 등을 얻을 수 있습니다.

【관련 추천: 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
// )
로그인 후 복사

이 예는 HTML 문서의 모든 이미지 링크를 가져오는 것입니다. 정규식에 비해 훨씬 편리하고, 코드 자체도 설명이 필요하기 때문에 정규식 매칭 실패 문제를 고려할 필요가 없습니다. PHP와 함께 제공되는 또 다른 Parse_url() 메소드와 협력하면 링크를 매우 편리하게 분석하고 원하는 콘텐츠를 추출할 수도 있습니다.

XML 구문 분석은 HTML 구문 분석과 유사하며 둘 다 DOMDocument 및 DOMElement에서 제공하는 메소드 인터페이스를 사용하여 쉽게 구문 분석할 수 있습니다. 그렇다면 표준 형식의 XML을 생성하려면 어떻게 해야 할까요? 물론, 이 클래스를 사용하여 개체 기반 작업을 수행할 필요도 없습니다.

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

/*
<?xml version="1.0" encoding="UTF-8"?>
<First type="1">This is First Node.</First>
<Second type="2"><Second-Child>This is Second Node Child.</Second-Child></Second>
*/
로그인 후 복사

사실 약간의 프론트엔드 JS 기반만 있으면 이 코드의 의미를 파악하는 것은 어렵지 않습니다. createElement() 메서드를 사용하여 DOMElement 객체를 생성한 다음 해당 객체에 속성과 콘텐츠를 추가합니다. 현재 DOMElement 또는 DOMDocument에 하위 노드를 추가하려면 AppendChild() 메서드를 사용합니다. 마지막으로 saveXML()을 사용하여 표준 XML 형식 콘텐츠를 생성합니다.

요약

위의 두 가지 간단한 예를 통해 모든 사람들이 이 DOMDocument가 XML 클래스 파일 구문 분석을 수행하는 방식에 매우 관심이 있을 것이라고 생각합니다. 그러나 일반 구문 분석 방법과 비교하여 성능이 얼마나 다른지에 대한 관련 테스트는 없습니다. 그러나 일반적인 상황에서는 웹 사이트의 HMTL 문서가 너무 크지 않기 때문에 결국 각 웹 사이트는 자체 로딩 속도도 고려합니다. 문서가 매우 크면 사용자 경험이 좋지 않으므로 일상적인 크롤러 분석 및 처리에 이 인터페이스 세트를 사용하는 데 기본적으로 문제가 없습니다.

테스트 코드:

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
로그인 후 복사

참조 문서:
https://www.php.net/manual/zh/class.domdocument.php

위 내용은 PHP에서 DOMDocument를 사용하여 HTML 및 XML 문서를 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿