>웹 프론트엔드 >HTML 튜토리얼 >DiDOM을 사용하여 HTML을 구문 분석하는 PHP 코드

DiDOM을 사용하여 HTML을 구문 분석하는 PHP 코드

WBOY
WBOY원래의
2023-09-08 11:41:131055검색

DiDOM을 사용하여 HTML을 구문 분석하는 PHP 코드

때때로 개발자는 웹사이트에서 일부 정보를 얻기 위해 웹페이지를 크롤링해야 합니다. 예를 들어, Wikipedia에서 여러 나라의 수도에 대한 지리 정보를 얻어야 하는 개인 프로젝트를 진행하고 있다고 가정해 보겠습니다. 수동 입력에는 시간이 많이 걸립니다. 그러나 PHP를 사용하면 Wikipedia 페이지를 스크랩하여 매우 빠르게 이 작업을 수행할 수 있습니다. 전체 마크업을 수동으로 탐색할 필요 없이 특정 정보에 대해 HTML을 자동으로 구문 분석할 수도 있습니다.

이 튜토리얼에서는 DiDOM이라는 빠르고 사용하기 쉬운 HTML 파서를 살펴보겠습니다. 설치 프로세스부터 시작한 다음 다양한 유형의 선택기(예: 태그, 클래스 등)를 사용하여 웹 페이지의 다양한 요소에서 정보를 추출하는 방법을 알아봅니다.

설치 및 사용

다음 명령을 실행하여 프로젝트 디렉터리에 DiDOM을 쉽게 설치할 수 있습니다.

으아아아

위 명령을 실행한 후 문자열, 로컬 파일 또는 웹 페이지에서 HTML을 로드할 수 있습니다. 예는 다음과 같습니다.

으아아아

문서에서 HTML을 구문 분석하기로 결정하면 이미 로드되어 변수에 저장되었을 수 있습니다. 이 경우 해당 변수를 Document()에 전달하면 DiDOM이 문자열을 구문 분석할 준비를 합니다.

HTML을 파일이나 URL에서 로드해야 하는 경우 이를 첫 번째 매개변수로 Document() 并将第二个参数设置为 true에 전달하고 두 번째 매개변수를 true로 설정할 수 있습니다.

매개변수 없이 new Document() 创建一个新的 Document 对象。在这种情况下,您可以调用方法 loadHtml() 从字符串加载 HTML,并调用 loadHtmlFile()를 사용하여 파일이나 웹 페이지에서 HTML을 로드할 수도 있습니다.

HTML 요소 찾기

요소에서 HTML이나 텍스트를 가져오기 전에 가장 먼저 해야 할 일은 요소 자체를 찾는 것입니다. 가장 간단한 방법은 find() 메소드를 사용하고 원하는 요소의 CSS 선택기를 첫 번째 인수로 전달하는 것입니다.

요소의 XPath를 find() 方法的第一个参数传递。但是,这需要您传递 Query::TYPE_XPATH 메소드의 첫 번째 매개변수로 전달할 수도 있습니다. 그러나 이를 위해서는 Query::TYPE_XPATH를 두 번째 매개변수로 전달해야 합니다.

XPath 값만 사용하여 HTML 요소를 찾으려면 쿼리를 전달하는 대신 <code class="inline">xpath() 메서드를 사용하면 됩니다. :TYPE_XPATH 매번 xpath() 方法,而不是传递 Query::TYPE_XPATH每次作为 find()의 두 번째 매개변수입니다.

DiDOM이 전달된 CSS 선택기 또는 XPATH 표현식과 일치하는 요소를 찾을 수 있으면 DiDomElement 인스턴스 배열을 반환합니다. 해당 요소가 발견되지 않으면 빈 배열을 반환합니다.

이 메서드는 배열을 반환하므로 find()[n-1]를 사용하여 일치하는 n번째 요소에 직접 액세스할 수 있습니다.

예시

아래 예에서는 워싱턴 DC에 관한 Wikipedia 기사의 모든 첫 번째 및 두 번째 수준 제목에서 내부 HTML을 가져옵니다

으아아아

워싱턴 DC에 관한 Wikipedia 기사의 URL을 전달하여 새 Document 개체를 만드는 것부터 시작합니다. 그런 다음 find() 方法获取主标题元素并将其存储在名为 $main_heading 的变量内。我们现在可以在此元素上调用不同的方法,例如 text()innerHtml()html() 메소드를 사용하여 기본 제목 요소를 가져와 $main_heading이라는 변수에 저장합니다. 이제 이 요소에 대해

, innerHtml(), html() 등과 같은 다양한 메서드를 호출할 수 있습니다.

html() 方法即可返回整个标题元素的 HTML。同样,我们可以使用 innerHtml() 方法获取特定元素内的 HTML。有时,您会对元素的纯文本内容而不是其 HTML 更感兴趣。在这种情况下,您只需使用 text()주 제목의 경우

메소드만 호출하면 됩니다.

두 번째 수준 제목은 Wikipedia 페이지를 잘 정의된 섹션으로 나눕니다. 그러나 "참조", "참고" 등과 같은 부제목 ​​중 일부를 제거할 수도 있습니다.

text()한 가지 방법은 모든 보조 제목을 반복하여

메서드에서 반환된 값을 확인하는 것입니다. 반환된 제목 텍스트가 "See Also"이면 루프에서 빠져 나옵니다.

$document->find('h2')[3]$document- 可以直接到达第四或第六级二级标题>find('h2')[5]각각

을 사용하세요.

DOM 위아래로 탐색

특정 요소에 액세스하면 라이브러리를 통해 DOM 트리를 위아래로 탐색하여 다른 요소에 쉽게 액세스할 수 있습니다.

parent() 方法转到 HTML 元素的父元素。同样,您可以使用 nextSibling()previousSibling()

메소드를 사용하여 요소의 다음 또는 이전 형제를 가져올 수 있습니다. 🎜

还有很多方法可用于访问 DOM 元素的子元素。例如,您可以使用 child(n) 方法获取特定的子元素。同样,您可以使用 firstChild()lastChild() 方法访问特定元素的第一个或最后一个子元素。您可以使用 children() 方法循环遍历特定 DOM 元素的所有子元素。

一旦到达特定元素,您将能够使用 html()innerHtml()text() 方法。

在下面的示例中,我们从二级标题元素开始,并继续检查下一个同级元素是否包含一些文本。一旦我们找到带有一些文本的同级元素,我们就会将其输出到浏览器。

require_once('vendor/autoload.php');

use DiDom\Document;

$document = new Document('https://en.wikipedia.org/wiki/Washington,_D.C.', true);

$sub_headings = $document->find('h2');

for($i = 1; $i < count($sub_headings); $i++) {
    if($sub_headings[$i]->text() !== 'See also') {
        $next_sibling = $sub_headings[$i]->nextSibling();
        while(!$next_elem->html()) {
            $next_sibling = $next_sibling->nextSibling();
        }

        echo $next_elem->html()."<br>";
    } else {
        break;
    }
}

您可以使用类似的技术循环遍历所有同级元素,并且仅在文本包含特定字符串或同级元素是段落标记等时输出文本。一旦您了解了基础知识,找到正确的信息就是简单的。

操作元素属性

在某些情况下,获取或设置不同元素的属性值的能力非常有用。例如,我们可以使用 $image_elem->attr( 'src').以类似的方式,您可以获得文档中所有 a 标记的 href 属性的值。

可以通过三种方法获取 HTML 元素的给定属性的值。您可以使用 getAttribute('attrName') 方法并将您感兴趣的属性名称作为参数传递。您还可以使用 attr('attrName') 方法,其工作方式与 getAttribute() 类似。最后,该库还允许您使用 $elem->attrName 直接获取属性值。这意味着您可以使用 $imageElem->src 直接获取图像元素的 src 属性值。

require_once('vendor/autoload.php');

use DiDom\Document;

$document = new Document('https://en.wikipedia.org/wiki/Washington,_D.C.', true);

$images = $document->find('img');

foreach($images as $image) {
    echo $image->src."<br>";
}

一旦您有权访问src属性,您就可以编写代码来自动下载所有图像文件。这样,您将能够节省大量时间。

您还可以使用三种不同的技术来设置给定属性的值。首先,您可以使用 setAttribute('attrName', 'attrValue') 方法来设置属性值。您还可以使用 attr('attrName', 'attrValue') 方法来设置属性值。最后,您可以使用 $Elem->attrName = 'attrValue' 设置给定元素的属性值。

添加、删除和替换元素

您还可以使用库提供的不同方法对加载的 HTML 文档进行更改。例如,您可以使用 appendChild()replace()从 DOM 树添加、替换或删除元素">删除() 方法。

该库还允许您创建自己的 HTML 元素,以便将它们附加到原始 HTML 文档中。您可以使用 new Element('tagName', 'tagContent') 创建新的 Element 对象。

请记住,如果您的程序在实例化之前不包含行 use DiDom\Element ,您将收到未捕获错误:未找到“Element”类错误元素对象。

获得该元素后,您可以使用 appendChild() 方法将其附加到 DOM 中的其他元素,也可以使用 replace( ) 方法使用新实例化的元素来替换文档中某些旧的 HTML 元素。下面的例子应该有助于进一步阐明这个概念。

require_once('vendor/autoload.php');

use DiDom\Document;
use DiDom\Element;

$document = new Document('https://en.wikipedia.org/wiki/Washington,_D.C.', true);

// This will result in error.
echo $document->find('h2.test-heading')[0]->html()."\n";

$test_heading = new Element('h2', 'This is test heading.');
$test_heading->class = 'test-heading';

$document->find('h1')[0]->replace($test_heading);

echo $document->find('h2.test-heading')[0]->html()."\n";

最初,我们的文档中没有 test-heading 类的 h2 元素。因此,如果我们尝试访问这样的元素,我们将不断收到错误。

验证不存在这样的元素后,我们创建一个新的h2元素,并将其class属性的值更改为test-heading >.

之后,我们将文档中的第一个 h1 元素替换为新创建的 h2 元素。再次在我们的文档中使用 find() 方法查找带有 test-heading 类的 h2 标题,现在将返回一个元素。

最终想法

本教程介绍了 PHP DiDOM HTML 解析器的基础知识。我们从安装开始,然后学习如何从字符串、文件或 URL 加载 HTML。之后,我们讨论了如何根据 CSS 选择器或 XPath 查找特定元素。我们还学习了如何获取元素的兄弟元素、父元素或子元素。其余部分介绍了如何操作特定元素的属性或在 HTML 文档中添加、删除和替换元素。

如果您希望我在教程中澄清任何内容,请随时在评论中告诉我。

위 내용은 DiDOM을 사용하여 HTML을 구문 분석하는 PHP 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.