함수 - xml object php




PHP에서 HTML/XML을 구문 분석하고 처리하는 방법은 무엇입니까? (20)

네이티브 XML 확장

나는 PHP와 함께 번들로 제공되기 때문에 네이티브 XML 확장 중 하나를 사용하는 것이 더 좋으며 보통 타사 라이브러리보다 빠르며 마크 업에 필요한 모든 컨트롤을 제공한다.

DOM

DOM 확장을 사용하면 PHP 5를 사용하여 DOM API를 통해 XML 문서를 조작 할 수 있습니다. W3C의 DOM (Document Object Model Core Level 3) 구현은 플랫폼 및 언어 중립적 인터페이스로, 프로그램과 스크립트가 동적으로 액세스하고 업데이트 할 수 있습니다 문서의 내용, 구조 및 스타일.

DOM은 실제 (파손 된) HTML을 구문 분석하고 수정할 수 있으며 XPath 쿼리를 수행 할 수 있습니다. libxml 기반으로합니다.

DOM으로 생산성을 높이는 데는 다소 시간이 걸리지 만 그럴 가치가 있습니다. DOM은 언어에 구애받지 않는 인터페이스이므로 여러 언어로 구현되어 있으므로 프로그래밍 언어를 변경해야 할 경우 해당 언어의 DOM API 사용 방법을 이미 알고있을 가능성이 있습니다.

기본적인 사용 예 는 A 요소의 href 속성을 얻는 것과 PHP의 DOMDocument에서 볼 수있는 일반적인 개념 개요를 찾을 수 있습니다.

DOM 확장을 사용하는 방법은 StackOverflow 에서 광범위하게 다루어 졌으므로 사용을 선택하면 스택 오버플로를 검색 / 브라우징하여 해결할 수있는 대부분의 문제를 확인할 수 있습니다.

XMLReader

XMLReader 확장은 XML 끌어 오기 구문 분석기입니다. 리더는 문서 스트림에서 앞으로 나아가는 각 노드에서 멈추는 커서 역할을합니다.

XMLReader는 DOM과 마찬가지로 libxml을 기반으로합니다. HTML 파서 모듈을 트리거하는 방법을 알지 못해서, XMLReader를 사용하여 깨진 HTML을 파싱하는 것이 libxml의 HTML 파서 모듈을 사용하도록 명시 적으로 말할 수있는 DOM을 사용하는 것보다 덜 강력 할 수 있습니다.

PHP를 사용하여 h1 태그로부터 모든 값을 얻는 기본적인 사용 예가 있습니다.

XML 파서

이 확장을 사용하여 XML 파서를 작성한 다음 다른 XML 이벤트에 대한 핸들러를 정의 할 수 있습니다. 각 XML 파서에는 사용자가 조정할 수있는 몇 가지 매개 변수가 있습니다.

XML 구문 분석기 라이브러리는 libxml을 기반으로하며 SAX 스타일 XML 푸시 구문 분석기를 구현합니다. DOM이나 SimpleXML보다 메모리 관리에 더 나은 선택이지만 XMLReader가 구현 한 끌어 오기 구문 분석기보다 작업하기가 어려울 수 있습니다.

SimpleXml

SimpleXML 확장은 XML을 일반 속성 선택기 및 배열 반복기를 사용하여 처리 할 수있는 객체로 변환하는 매우 간단하고 사용하기 쉬운 도구 집합을 제공합니다.

SimpleXML은 HTML이 유효한 XHTML이라는 것을 알고있는 옵션입니다. 깨진 HTML을 파싱해야하는 경우 SimpleXml을 고려하지 마십시오.

기본적인 사용 예제는 간단한 프로그램에서 CRUD 노드와 xml 파일의 노드 값 에서 찾을 수 있으며 PHP Manual 에는 많은 예제가 추가되었습니다 .

타사 라이브러리 (libxml 기반)

타사 라이브러리를 사용하기를 원한다면 문자열 파싱 대신 실제로 DOM / libxml 을 사용하는 lib를 사용하는 것이 좋습니다.

FluentDom - Repo

FluentDOM은 PHP의 DOMDocument를위한 유창한 XML 인터페이스 인 jQuery를 제공합니다. 선택기는 XPath 또는 CSS (CSS에서 XPath 변환기 사용)로 작성됩니다. 현재 버전은 표준 인터페이스를 구현하는 DOM을 확장하고 DOM Living Standard의 기능을 추가합니다. FluentDOM은 JSON, CSV, JsonML, RabbitFish 등과 같은 형식을로드 할 수 있습니다. Composer를 통해 설치할 수 있습니다.

HtmlPageDom

Wa72 \ HtmlPageDom은 HTML 문서를 쉽게 조작 할 수있는 PHP 라이브러리입니다. DOM 트리를 가로 지르기위한 Symfony2 구성 요소의 DomCrawler가 필요하며 HTML 문서의 DOM 트리를 조작하기위한 메소드를 추가하여 확장합니다.

phpQuery (수년간 업데이트되지 않음)

phpQuery는 PHP5로 작성된 jQuery JavaScript 라이브러리를 기반으로하는 서버 측 체인 방식의 CSS3 선택기 기반 DOM (Document Object Model) API로, 추가 명령 행 인터페이스 (CLI)를 제공합니다.

참조 : https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom은 DOM 문서 및 구조 작업을위한 도구를 제공합니다. 현재 우리는 XPath와 CSS 선택기를 모두 사용하여 DOM 문서를 쿼리하기위한 통합 인터페이스를 제공하는 Zend_Dom_Query를 제공합니다.

QueryPath

QueryPath는 XML과 HTML을 조작하기위한 PHP 라이브러리입니다. 로컬 파일뿐만 아니라 웹 서비스 및 데이터베이스 리소스에서도 작동하도록 설계되었습니다. jQuery 인터페이스 (CSS 스타일 선택기 포함)를 많이 구현하지만 서버 측 용도로 많이 조정됩니다. Composer를 통해 설치할 수 있습니다.

fDOMDocument

fDOMDocument는 PHP 경고 또는주의 대신 모든 경우에 예외를 사용하도록 표준 DOM을 확장합니다. 또한 편의를 위해 다양한 사용자 정의 메서드와 바로 가기를 추가하고 DOM 사용을 단순화합니다.

sabre/xml

saber / xml은 XMLReader 및 XMLWriter 클래스를 래핑 및 확장하여 "xml to object / array"매핑 시스템과 디자인 패턴을 만드는 라이브러리입니다. XML을 작성하고 읽는 것은 단일 통과이므로 빠른 XML 파일과 큰 XML 파일의 메모리가 필요합니다.

FluidXML

FluidXML은 간결하고 유창한 API로 XML을 조작하기위한 PHP 라이브러리입니다. XPath와 유창한 프로그래밍 패턴을 활용하여 재미 있고 효과적입니다.

타사 (libxml 기반 아님)

DOM / libxml을 구축 할 때 얻을 수있는 이점은 네이티브 확장을 기반으로하므로 좋은 성능을 얻을 수 있다는 것입니다. 그러나 모든 타사 라이브러리가이 경로를 따르는 것은 아닙니다. 아래에 나열된 일부

PHP 간단한 HTML DOM 파서

  • PHP5 +로 작성된 HTML DOM 파서는 매우 쉬운 방법으로 HTML을 조작 할 수있게합니다!
  • PHP 5 이상 필요.
  • 잘못된 HTML을 지원합니다.
  • jQuery와 같은 선택기로 HTML 페이지에서 태그를 찾으십시오.
  • HTML에서 내용을 한 줄로 추출합니다.

필자는 일반적으로이 파서를 권장하지 않습니다. 코드베이스는 끔찍하며 파서 자체는 느리고 메모리는 배가 고프다. 하위 선택기 와 같은 모든 jQuery 선택기가 가능하지는 않습니다. libxml 기반 라이브러리 중 어떤 것도 쉽게이를 능가해야합니다.

PHP는 HTML 파서

PHPHtmlParser는 jQuery와 같은 CSS 선택기를 사용하여 태그를 선택할 수있는 간단하고 유연한 html 파서입니다. 목표는 HTML의 스크랩을 빠르고 쉽게 할 수있는 도구의 개발을 지원하는 것입니다. 이 프로젝트는 sunra / php-simple-html-dom-parser에서 지원 한 원본 이었지만 지원이 중단 된 것처럼 보이기 때문에이 프로젝트는 이전 작업을 수정 한 것입니다.

다시 말하지만,이 파서는 추천하지 않습니다. CPU 사용량이 많으면 느립니다. 생성 된 DOM 객체의 메모리를 지우는 기능도 없습니다. 이러한 문제는 특히 중첩 루프와 함께 확장됩니다. 문서 자체가 정확하지 않고 철자가 틀리며 4 월 14 일 14 일 이후로 수정에 대한 응답이 없습니다.

Ganon

  • 범용 토크 나이저 및 HTML / XML / RSS DOM 파서
    • 요소와 그 속성을 조작하는 능력
    • 잘못된 HTML 및 UTF8 지원
  • 요소 (예 : jQuery와 같은 네임 스페이스 지원)에 대해 고급 CSS3와 유사한 쿼리를 수행 할 수 있습니다.
  • HTML 미화 (예 : HTML Tidy)
    • CSS 및 자바 스크립트 축소
    • 속성 정렬, 대소 문자 변경, 들여 쓰기 수정 등
  • 확장 가능
    • 현재 문자 / 토큰을 기반으로 콜백을 사용하여 문서 구문 분석
    • 작게 재정의하기 쉬운 작은 기능으로 분리 된 작업
  • 빠르고 쉬운

절대 사용하지 마십시오. 그것이 좋은 것인지 알 수 없습니다.

HTML 5

위의 HTML5 구문 분석에 사용할 수 있지만 HTML5에서 허용하는 마크 업으로 인해 문제가 발생할 수 있습니다 . 따라서 HTML5의 경우에는 다음과 같이 전용 파서를 사용하는 것이 좋습니다.

html5lib

주요 데스크톱 웹 브라우저와의 호환성을 최대화하기 위해 WHATWG HTML5 사양을 기반으로하는 Python 및 PHP 구현의 HTML 파서입니다.

HTML5가 완성되면 더 많은 전용 파서를 볼 수 있습니다. 체크 아웃 할만한 가치가있는 HTML 5 구문 분석을위한 W3의 How-To 라는 블로그 게시물도 있습니다.

웹 서비스

PHP 프로그래밍과 같은 느낌이 들지 않으면 웹 서비스를 사용할 수도 있습니다. 일반적으로 이것들을위한 유틸리티는 거의 찾지 못했지만 그것은 저와 제 유스 케이스입니다.

YQL

YQL 웹 서비스를 사용하면 응용 프로그램에서 인터넷을 통해 여러 소스의 데이터를 쿼리하고 필터링하고 결합 할 수 있습니다. YQL 문은 데이터베이스와 관련된 모든 개발자에게 익숙한 SQL과 유사한 구문을 사용합니다.

ScraperWiki .

ScraperWiki의 외부 인터페이스를 사용하면 웹이나 자신의 응용 프로그램에서 사용하려는 형식으로 데이터를 추출 할 수 있습니다. 스크레이퍼 상태에 대한 정보를 추출 할 수도 있습니다.

정규 표현식

마지막으로 정규식 으로 HTML에서 데이터를 추출 할 수 있습니다. 일반적으로 HTML에 대한 정규 표현식 사용은 권장하지 않습니다.

웹에서 마크 업과 일치하는 대부분의 스 니펫은 취약합니다. 대부분의 경우 그들은 아주 특정한 HTML을 위해 일하고 있습니다. 공백을 어딘가에 추가하거나 태그의 속성을 변경하거나 태그를 변경하는 것과 같이 작은 마크 업 변경으로 인해 RegEx가 제대로 작성되지 않으면 실패 할 수 있습니다. HTML에 RegEx를 사용하기 전에 무엇을하는지 알아야합니다.

HTML 파서는 이미 HTML의 구문 규칙을 알고 있습니다. 귀하가 작성하는 새로운 RegEx마다 정규 표현식을 가르쳐야합니다. RegEx는 경우에 따라 문제가 없지만 실제로는 사용 사례에 따라 다릅니다.

보다 신뢰할 수있는 파서를 작성할 수 있지만, 정규 표현식을 사용하여 완전하고 신뢰할 수있는 사용자 정의 파서를 작성하는 것은 앞서 언급 한 라이브러리가 이미 존재하며이를 더 잘 수행하는 데 시간 낭비입니다.

또한 구문 분석 HTML을 참조하십시오 Cthulhu 방법

서적

돈을 쓰고 싶다면 좀 봐.

PHP Architect 또는 저자와 제휴 관계가 아닙니다.

어떻게 HTML / XML을 파싱하고 그것으로부터 정보를 추출 할 수 있습니까?


1a와 2의 경우 : 새로운 Symfony Componet 클래스 DOMCrawler ( DomCrawler )에 투표 할 것입니다. 이 클래스는 CSS 선택자와 비슷한 쿼리를 허용합니다. 이 프리젠 테이션을 실제 세계에서의 예를 보려면보십시오 : news-of-the-symfony2-world .

이 구성 요소는 독립 실행 형으로 설계되어 Symfony없이 사용할 수 있습니다.

유일한 단점은 PHP 5.3 이상에서만 작동한다는 것입니다.


HTML / XML DOM을 처리하는 방법에는 여러 가지가 있으며, 그 중 가장 많은 부분이 이미 언급되었습니다. 그러므로, 나는 그들 자신을 나열하려고 시도하지 않을 것이다.

나는 개인적으로 DOM 확장을 사용하는 것을 선호한다고 덧붙이고 싶다. 이유는 무엇인가?

  • iit은 기본 C 코드의 성능 이점을 최적으로 사용합니다.
  • 그것은 OO PHP (그리고 내가 그것을 하위 클래스 수 있습니다)
  • 오히려 저레벨 (더 진보 된 행동을위한 비 부풀어 오른 기초로서 사용할 수있게 해줌)
  • 그것은 DOM의 모든 부분에 대한 액세스를 제공합니다 (SimpleXml과는 달리, 덜 알려진 XML 기능 중 일부를 무시합니다)
  • 네이티브 Javascript에서 사용되는 구문과 유사한 DOM 크롤링에 사용되는 구문이 있습니다.

DOMDocument CSS 선택기를 사용할 수있는 기능이 없기 때문에 DOMDocument 서브 클래스로 만들고 하위 클래스에 JS와 유사한 querySelectorAllquerySelector 메소드를 추가하는 등 매우 간단하고 편리한 방법이 있습니다.

선택기를 파싱하려면 Symfony 프레임 워크 에서 매우 최소한의 CssSelector 구성 요소 를 사용하는 것이 좋습니다. 이 구성 요소는 CSS 선택기를 XPath 선택기로 변환 한 다음 DOMXpath 에 공급하여 해당 Nodelist를 검색합니다.

그런 다음이 (여전히 매우 낮은 수준의) 하위 클래스를 더 높은 수준의 클래스를위한 기반으로 사용할 수 있습니다 (예 : 특정 유형의 XML을 구문 분석하거나 jQuery와 유사한 동작을 추가합니다.

아래의 코드는 제 PHPPowertools/DOM-Query 에서 곧바로 나오고 제가 설명한 기술을 사용합니다.

HTML 구문 분석의 경우 :

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '<!DOCTYPE ') === 0 || strpos($data_start, '<html>') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('<!DOCTYPE html><html><head><meta charset="' . $encoding . '" /></head><body></body></html>');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

Symfony의 CssSelector 컴포넌트를 생성하고 사용하는 방법을 결정한 Symfony의 제작자 인 Fabien Potencier 가 CSS 선택기XML 문서를 파싱하는 것도 참조하십시오.


HTML을 정규 표현식으로 구문 분석하지 않는 몇 가지 이유가 있습니다. 그러나 HTML이 생성 될지에 대한 완전한 제어권을 가지고 있다면 간단한 정규 표현식으로 할 수 있습니다.

위에는 HTML을 정규 표현식으로 구문 분석하는 함수가 있습니다. 이 함수는 매우 민감하므로 HTML이 특정 규칙을 따르도록 요구하지만 많은 시나리오에서 잘 작동합니다. 간단한 파서를 원한다면 라이브러리를 설치하지 않으려면 다음과 같이하십시오 :

function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));

    return $result;
}

function extract_data($str) {
    return (is_array($str))
        ? array_map('extract_data', $str)
        : ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</\1>#s', $str, $matches))
            ? $str
            : array_map(('extract_data'), array_combine_($matches[1], $matches[2])));
}

print_r(extract_data(file_get_contents("http://www.google.com/")));


jQuery 선택기에 익숙하다면 ScarletsQuery for PHP를 사용할 수 있습니다.

<pre><?php
include "ScarletsQuery.php";

// Load the HTML content and parse it
$html = file_get_contents('https://www.lipsum.com');
$dom = Scarlets\Library\MarkupLanguage::parseText($html);

// Select meta tag on the HTML header
$description = $dom->selector('head meta[name="description"]')[0];

// Get 'content' attribute value from meta tag
print_r($description->attr('content'));

$description = $dom->selector('#Content p');

// Get element array
print_r($description->view);

이 라이브러리는 일반적으로 오프라인 html을 처리하는 데 1 초도 채 걸리지 않습니다.
태그 속성에 유효하지 않은 HTML이나 누락 된 인용 부호를 사용할 수도 있습니다.


나는 PHP Simple HTML DOM Parser를 추천한다.

정말 멋진 기능이 있습니다.

foreach($html->find('img') as $element)
       echo $element->src . '<br>';

네, 그 목적으로 simple_html_dom을 사용할 수 있습니다. 그러나 simple_html_dom과 함께 많은 작업을 해왔습니다. 특히 웹 스크래핑 (scrapping) 작업에 너무 취약한 것으로 나타났습니다. 그것은 기본적인 일을하지만 어쨌든 그것을 권하지는 않을 것입니다.

나는 결코 목적을 위해 컬을 사용하지 않았지만, 내가 배운 것은 컬이 훨씬 효율적으로 작업을 수행 할 수 있고 훨씬 더 견고하다는 것입니다.

이 링크를 잘 살펴보십시오. scraping-websites-with-curl


여기서 언급하지 못했던 한 가지 일반적인 접근법은 Tidy 통해 HTML을 실행하는 것입니다. Tidy 는 보증 된 유효한 XHTML을 추출하도록 설정할 수 있습니다. 그런 다음 이전 XML 라이브러리를 사용할 수 있습니다.

그러나 특정 문제에 대해서는 http://fivefilters.org/content-only/ -이 프로젝트를 살펴보아야합니다. Readability 알고리즘의 수정 된 버전으로, 텍스트 콘텐츠 (헤더가 아닌 및 바닥 글)을 페이지에서 가져올 수 있습니다.


우리는 이전에 우리가 필요로했던 많은 크롤러를 만들었습니다. 하루가 끝나면 보통 일을 가장 잘하는 것은 간단한 정규 표현식입니다. 위에 나열된 라이브러리가 작성된 이유로 적합하지만 원하는 내용을 알고있는 경우 유효하지 않은 HTML / XHTML 구조도 처리 할 수 ​​있으므로 정규 표현식을 사용하는 것이 더 안전합니다.로드되지 않으면 실패합니다 대부분의 파서를 통해


이것은 일반적으로 화면 스크래핑 이라고도합니다. 이 라이브러리는 Simple HTML Dom Parser 입니다.


phpQueryQueryPath 는 유창한 jQuery API를 복제하는 것과 매우 유사합니다. 이것이 PHP에서 HTML을 적절하게 파싱하는 가장 쉬운 방법 중 두 가지입니다.

QueryPath 예제

기본적으로 먼저 HTML 문자열에서 쿼리 가능한 DOM 트리를 만듭니다.

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

결과 객체에는 HTML 문서의 전체 트리 표현이 포함됩니다. DOM 메서드를 사용하여 탐색 할 수 있습니다. 하지만 일반적인 접근법은 jQuery와 같은 CSS 선택기를 사용하는 것입니다.

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

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

대부분 ->find() 대해 간단한 #id.class 또는 DIV 태그 선택자를 사용하려고합니다. 그러나 XPath 문을 사용할 수도 있는데 때로는 빠릅니다. 또한 ->children()->text() 및 특히 ->attr() 과 같은 일반적인 jQuery 메서드는 올바른 HTML 코드 단편을 추출하는 것을 단순화합니다. (그리고 이미 SGML 엔티티가 디코딩되어 있습니다.)

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

QueryPath는 또한 새로운 태그를 스트림에 ->append ( ->append )하고 나중에 업데이트 된 문서를 출력하고 prettify ( ->writeHTML ) 할 수 있습니다. 조작 된 HTML뿐만 아니라 다양한 XML 언어 (네임 스페이스 포함)를 구문 분석 할 수 있으며 HTML 마이크로 포맷 (XFN, vCard)에서 데이터를 추출 할 수도 있습니다.

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

.

phpQuery 또는 QueryPath?

일반적으로 QueryPath는 문서 조작에 더 적합합니다. phpQuery는 jQuery와 좀 더 가깝게 유사 AJAX 메소드 (단지 HTTP 요청)를 구현한다. phpQuery는 (전체 기능이 적기 때문에) QueryPath보다 종종 빠르다고합니다.

차이점에 대한 더 자세한 정보 는 tagbyte.org의 wayback machine에서 비교해보십시오 . (원본 소스가 누락되어 인터넷 보관 링크가 있습니다. 예, 누락 된 페이지는 계속 찾을 수 있습니다.)

여기 에 포괄적 인 QueryPath 소개가 있습니다.

장점

  • 단순성과 신뢰성
  • 사용하기 쉬운 대안 ->find("a img, a object, div a")
  • 적절한 데이터 이스케이프 처리 (정규 표현식 grepping과 비교)

HTML5 , html5 라이브러리는 몇 년 동안 버려졌습니다. 최근 업데이트 및 유지 관리 기록에서 찾을 수있는 유일한 HTML5 라이브러리는 html5-php 로 불과 일주일 전에 베타 1.0으로 변경되었습니다.


HTML Tidy 와 같은 것을 사용하여 "손상된"HTML을 정리하고 HTML을 XHTML로 변환 한 다음 XML 파서로 구문 분석 할 수 있습니다.


XML_HTMLSax 는 더 이상 유지되지 않아도 안정적입니다. 또 다른 옵션은 Html Tidy를 통해 HTML 을 파이프 처리 한 다음 표준 XML 도구로 파싱하는 것입니다.


간단한 HTML DOM 파서를 사용 해라.

  • 아주 쉬운 방법으로 HTML을 조작 할 수있는 PHP 5+로 작성된 HTML DOM 파서입니다!
  • PHP 5 이상 필요.
  • 잘못된 HTML을 지원합니다.
  • jQuery와 같은 선택기로 HTML 페이지에서 태그를 찾으십시오.
  • HTML에서 내용을 한 줄로 추출합니다.
  • Download


예 :

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>';


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;


HTML에서 콘텐츠 추출 :

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


긁어 모으는 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);

https://github.com/ivopetkov/html5-dom-document-php 에서 자유롭게 사용할 수있는 HTML5DOMDocument라는 라이브러리를 만들었습니다.

그것은 당신의 경우에 매우 도움이 될 것이라고 생각하는 쿼리 선택 자도 지원합니다. 다음은 몇 가지 예제 코드입니다.

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello</h1><div class="content">This is some text</div></body></html>');
echo $dom->querySelector('h1')->innerHTML;

고급 HTML 돔 은 동일한 인터페이스를 제공하는 간단한 HTML DOM 대체품이지만 관련 메모리 문제가 발생하지 않는 DOM 기반입니다.

또한 jQuery 확장을 포함하여 완전한 CSS를 지원합니다.


QueryPath 는 훌륭하지만, "추적 상태"에주의하십시오. 무슨 뜻인지 몰랐다면, 디버깅 시간을 많이 낭비하여 무슨 일이 일어 났는지, 왜 코드가 작동하지 않는지를 알 수 있습니다.

이것이 의미하는 바는 결과 집합의 각 호출이 객체의 결과 집합을 수정하고 각 링크가 새로운 집합 인 jquery처럼 체인이 가능하지 않으며 쿼리의 결과 인 단일 집합을 가지며 각 함수 호출이 수정됩니다 그 단일 세트.

jquery와 같은 동작을 얻으려면 필터를 수행하거나 비슷한 작업을 수정하기 전에 분기해야합니다. 즉, jquery에서 일어나는 일을 훨씬 더 밀접하게 반영 할 것입니다.

$results = qp("div p");
$forename = $results->find("input[name='forename']");

$results 이제 input[name='forename'] 대한 결과 집합이 포함되어 있습니다. 원래 쿼리 "div p"아니기 때문에 이렇게 많은 일이 발생했습니다. QueryPath 가 필터를 추적하고 결과와 상점을 수정하는 모든 것을 발견했습니다. 그것들을 대상에 넣는다. 대신이 작업을 수행해야합니다.

$forename = $results->branch()->find("input[name='forname']")

$results 는 수정되지 않고 결과 세트를 반복적으로 재사용 할 수 있습니다. 아마도 많은 지식을 가진 사람이 이것을 조금씩 지울 수는 있지만, 기본적으로 내가 발견 한 것과 같습니다.


정규 표현식 을 사용해야 하는 이유는 무엇입니까?

우선, 일반적인 잘못된 이름 : Regexps는 HTML을 " 파싱 " 하지 않습니다. 하지만 Regexes는 데이터를 " 추출 " 할 수 있습니다. 추출은 그들이 추출한 것입니다. 적절한 SGML 툴킷이나 기본 XML 파서를 통한 정규식 HTML 추출의 주요 단점은 구문 론적 노력과 다양한 안정성입니다.

다소 신뢰할 수있는 HTML 추출 정규식을 만드는 것을 고려하십시오.

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

단순한 phpQuery 또는 QueryPath와 동등한 방법보다 읽기 쉽습니다.

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

그러나 그들이 도움을 줄 수있는 구체적인 사용 사례가 있습니다.

  • 많은 DOM traversal 프론트 엔드는 HTML 주석 <!-- 표시하지 않지만 추출을위한보다 유용한 앵커이기도합니다. 특히 pseudo-HTML 변형 <$var> 또는 SGML 잔여 물은 정규 표현식으로 길들이기 쉽습니다.
  • 흔히 정규식은 후 처리를 절약 할 수 있습니다. 그러나 HTML 엔티티는 종종 수작업을 필요로합니다.
  • 마지막으로, <img src = urls를 추출 하는 것과 같이 아주 단순한 작업의 경우, 실제로는 가능한 도구입니다. SGML / XML 파서를 능가하는 속도상의 이점은 이러한 기본적인 추출 절차에 주로 사용됩니다.

정규식 /<!--CONTENT-->(.+?)<!--END-->/ 사용하여 HTML 스 니펫을 미리 추출하는 것이 좋습니다. 더 간단한 HTML 파서 프론트 엔드를 사용하여 나머지를 처리하는 것이 좋습니다.

참고 : 실제로 XML 파싱 및 정규 표현식을 사용하는이 appapp . 바로 지난 주 PyQuery 구문 분석이 실패하고 정규 표현식이 계속 작동합니다. 네, 이상 해요. 그리고 나 자신을 설명 할 수는 없어요. 하지만 그렇게되었습니다.
따라서 실제 고려 사항을 투표하지 마십시오. 정규식 = 악마와 일치하지 않기 때문입니다. 그러나 너무 많이 찬성하지 않겠습니다. 이 주제에 대한 부연 설명 일뿐입니다.





html-parsing