etc./StackOverFlow

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까?

청렴결백한 만능 재주꾼 2021. 12. 1. 00:00
반응형

질문자 :Community Wiki


어떻게 HTML/XML을 구문 분석하고 정보를 추출할 수 있습니까?



네이티브 XML 확장

PHP와 함께 번들로 제공되고 일반적으로 모든 타사 라이브러리보다 빠르며 마크업에 필요한 모든 제어 기능을 제공하기 때문에 기본 XML 확장 중 하나를 사용하는 것을 선호합니다.

DOM

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

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

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

기본 사용 예 는 A 요소의 href 속성 가져 오기에서 찾을 수 있고 일반적인 개념 개요는 php의 DOMDocument에서 찾을 수 있습니다.

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

XMLReader

XMLReader 확장은 XML 풀 파서입니다. 판독기는 문서 스트림에서 앞으로 이동하고 도중에 각 노드에서 멈추는 커서 역할을 합니다.

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

기본 사용 예는 php를 사용하여 h1 태그에서 모든 값 가져오기 에서 찾을 수 있습니다.

XML 파서

이 확장을 사용하면 XML 파서를 만든 다음 다른 XML 이벤트에 대한 처리기를 정의할 수 있습니다. 각 XML 파서는 조정할 수 있는 몇 가지 매개변수도 있습니다.

XML 파서 라이브러리도 libxml을 기반으로 하며 SAX 스타일 XML 푸시 파서를 구현합니다. DOM 또는 SimpleXML보다 메모리 관리에 더 나은 선택일 수 있지만 XMLReader로 구현된 풀 파서보다 작업하기가 더 어렵습니다.

SimpleXml

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

SimpleXML은 HTML이 유효한 XHTML임을 알고 있는 경우의 옵션입니다. 깨진 HTML을 구문 분석해야 하는 경우 질식할 수 있으므로 SimpleXml을 고려하지 마십시오.

기본적인 사용 예는 A simple program to CRUD node and node values of xml file 에서 찾을 수 있으며 PHP 매뉴얼에 많은 추가 예제가 있습니다.


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

타사 라이브러리를 사용하고 싶다면 문자열 구문 분석 대신 DOM / libxml 을 실제로 사용하는 라이브러리를 사용하는 것이 좋습니다.

FluentDom - 레포

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

HTML페이지돔

Wa72\HtmlPageDom 은 DOM을 사용하여 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은 DOM 문서 및 구조 작업을 위한 도구를 제공합니다. 현재 XPath 및 CSS 선택기를 모두 사용하여 DOM 문서를 쿼리하기 위한 통합 인터페이스를 제공하는 Zend_Dom_Query를 제공합니다.

쿼리 경로

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

fDOM문서

fDOMDocument는 표준 DOM을 확장하여 PHP 경고 또는 알림 대신 오류가 발생할 때마다 예외를 사용합니다. 또한 편의성과 DOM 사용을 단순화하기 위해 다양한 사용자 정의 메서드와 바로 가기를 추가합니다.

세이버/xml

sabre/xml은 XMLReader 및 XMLWriter 클래스를 래핑하고 확장하여 간단한 "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일 이후 수정 사항에 대한 응답이 없습니다.

가논

  • 범용 토크나이저 및 HTML/XML/RSS DOM 파서
  •  Ability to manipulate elements and their attributes
  •  Supports invalid HTML and UTF8
  •  Can perform advanced CSS3-like queries on elements (like jQuery -- namespaces supported)
  • HTML 미화(HTML Tidy와 같은)
  •  Minify CSS and Javascript
  •  Sort attributes, change character case, correct indentation, etc.
  • 확장 가능
  •  Parsing documents using callbacks based on current character/token
  •  Operations separated in smaller functions for easy overriding
  • 빠르고 쉬운

사용하지 않았습니다. 좋은지 알 수 없습니다.


HTML 5

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

HTML5lib

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

HTML5가 완성되면 더 많은 전용 파서를 볼 수 있습니다. W3의 How-To for html 5 parsing 이라는 블로그 게시물도 체크아웃할 가치가 있습니다.


웹 서비스

PHP 프로그래밍이 마음에 들지 않으면 웹 서비스를 사용할 수도 있습니다. 일반적으로 나는 이것들에 대한 유용성을 거의 찾지 못했지만 그것은 나와 내 사용 사례일 뿐입니다.

스크레이퍼위키 .

ScraperWiki의 외부 인터페이스를 사용하면 웹이나 자체 애플리케이션에서 사용하기 위해 원하는 형식으로 데이터를 추출할 수 있습니다. 모든 스크레이퍼의 상태에 대한 정보를 추출할 수도 있습니다.


정규식

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

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

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

더 안정적인 파서를 작성할 수 있지만 정규 표현식을 사용하여 완전하고 안정적인 사용자 정의 파서를 작성하는 것은 앞서 언급한 라이브러리가 이미 존재하고 이에 대해 훨씬 더 나은 작업을 수행할 때 시간 낭비입니다.

HTML 구문 분석 The Cthulhu Way 도 참조하십시오.


서적

돈 좀 쓰실 분들은 참고하세요

저는 PHP Architect 또는 저자와 관련이 없습니다.


Gordon

Simple HTML DOM Parser를 사용해보십시오.

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

참고: 이름에서 알 수 있듯이 간단한 작업에 유용할 수 있습니다. HTML 파서 대신 정규식을 사용하므로 더 복잡한 작업의 경우 상당히 느립니다. 코드베이스의 대부분은 2008년에 작성되었으며 그 이후로 약간의 개선만 이루어졌습니다. 최신 PHP 코딩 표준을 따르지 않으며 최신 PSR 호환 프로젝트에 통합하기 어려울 수 있습니다.

예:

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;

스크래핑 슬래시닷:

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

Naveed

DOMDocument->loadHTML()을 사용 하고 완료하십시오. libxml의 HTML 파싱 알고리즘은 상당히 훌륭하고 빠르며 일반적인 믿음과 달리 잘못된 형식의 HTML을 질식시키지 않습니다.


Edward Z. Yang

왜 정규 표현식을 사용 하면 안 되며 언제 사용해야 합니까?

첫째, 일반적인 잘못된 이름입니다. 정규 표현식은 HTML 을 " 파싱 "하기 위한 것이 아닙니다. 그러나 정규식은 데이터를 " 추출 "할 수 있습니다. 추출은 그들이 만든 것입니다. 적절한 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 순회 프론트엔드는 HTML 주석 <!-- 표시하지 않지만 때로는 추출에 더 유용한 앵커입니다. 특히 의사 HTML 변형 <$var> 또는 SGML 잔여물은 정규 표현식으로 쉽게 길들일 수 있습니다.
  • 종종 정규식은 후처리를 절약할 수 있습니다. 그러나 HTML 엔터티는 종종 수동 관리가 필요합니다.
  • 마지막으로 <img src= url 추출과 같은 매우 간단한 작업의 경우 실제로 가능한 도구입니다. SGML/XML 파서에 비해 속도의 이점은 대부분 이러한 매우 기본적인 추출 절차에 적용됩니다.

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

참고: 실제로 이 이 있습니다. 여기서 XML 구문 분석과 정규식을 번갈아 사용합니다. 지난주에 PyQuery 구문 분석이 중단되었고 정규식은 여전히 작동했습니다. 예, 이상하고 스스로 설명할 수 없습니다. 하지만 그렇게 되었습니다.
따라서 regex=evil meme과 일치하지 않는다고 해서 실제 고려 사항을 무시하지 마십시오. 하지만 너무 많이 투표하지 맙시다. 이 주제에 대한 참고 사항일 뿐입니다.


Community Wiki

이 답변은 현재 10년 이상 방치된 라이브러리를 권장합니다.

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 ), 나중에 업데이트된 문서를 출력하고 ->writeHTML 있습니다( ->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의 웨이백 머신에 대한 비교를 참조하십시오. (원본 출처가 없어져서 여기에 인터넷 아카이브 링크가 있습니다. 예, 여전히 누락된 페이지를 찾을 수 있습니다.)

장점

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

Community Wiki

Simple HTML DOM은 훌륭한 오픈 소스 파서입니다.

simplehtmldom.sourceforge

DOM 요소를 객체 지향 방식으로 처리하며, 새로운 반복은 비준수 코드에 대한 많은 적용 범위를 가지고 있습니다. 또한 "찾기" 기능과 같이 JavaScript에서 볼 수 있는 것과 같은 몇 가지 훌륭한 기능이 있습니다. 이 기능은 해당 태그 이름의 요소에 대한 모든 인스턴스를 반환합니다.

나는 이것을 여러 도구에서 사용하고 다양한 유형의 웹 페이지에서 테스트했으며 훌륭하게 작동한다고 생각합니다.


Robert Elwell

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

그러나 특정 문제에 대해서는 다음 프로젝트를 살펴봐야 합니다. http://fivefilters.org/content-only/ -- 이것은 헤더가 아닌 텍스트 콘텐츠만 추출하도록 설계된 가독성 알고리즘의 수정된 버전입니다. 및 바닥글) 페이지에서.


Eli

1a 및 2: 새로운 Symfony Componet 클래스 DOMCrawler( DomCrawler )에 투표하겠습니다. 이 클래스는 CSS 선택기와 유사한 쿼리를 허용합니다. 실제 사례를 보려면 이 프레젠테이션을 살펴보십시오. news-of-the-symfony2-world .

구성 요소는 독립 실행형으로 작동하도록 설계되었으며 Symfony 없이 사용할 수 있습니다.

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


Community Wiki

그런데 이것을 일반적으로 화면 스크래핑 이라고 합니다. 이를 위해 사용한 라이브러리는 Simple HTML Dom Parser 입니다.


Joel Verhagen

우리는 이전에 필요에 따라 꽤 많은 크롤러를 만들었습니다. 하루가 끝나면 일반적으로 가장 잘하는 것은 간단한 정규 표현식입니다. 위에 나열된 라이브러리는 생성된 이유 때문에 좋지만 찾고 있는 것이 무엇인지 안다면 정규 표현식이 더 안전한 방법입니다. 로드하면 실패할 유효하지 않은 HTML / XHTML 구조도 처리할 수 있기 때문입니다. 대부분의 파서를 통해.


jancha

PHP Simple HTML DOM Parser를 추천합니다.

다음과 같은 멋진 기능이 있습니다.

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

Greg

이것은 W3C XPath 기술에 대한 좋은 작업 설명처럼 들립니다. <foo><bar><baz> elements 중첩된 img href 속성을 반환합니다."와 같은 쿼리를 표현하는 것은 쉽습니다. PHP 애호가가 아니기 때문에 어떤 형태로 XPath를 사용할 수 있는지 말할 수 없습니다. HTML 파일을 처리하기 위해 외부 프로그램을 호출할 수 있다면 XPath의 명령줄 버전을 사용할 수 있어야 합니다. 빠른 소개는 http://en.wikipedia.org/wiki/XPath 를 참조하십시오.


Jens

String Parsing 대신 DOM을 사용하는 SimpleHtmlDom에 대한 타사 대안: phpQuery , Zend_Dom , QueryPathFluentDom .


Community Wiki

예, 목적을 위해 simple_html_dom을 사용할 수 있습니다. 그러나 나는 특히 웹 스크래핑을 위해 simple_html_dom으로 꽤 많은 작업을 했고 그것이 너무 취약하다는 것을 발견했습니다. 기본 작업은 수행하지만 어쨌든 권장하지 않습니다.

나는 그 목적으로 curl을 사용한 적이 없지만 내가 배운 것은 curl이 훨씬 더 효율적으로 작업을 수행할 수 있고 훨씬 더 견고하다는 것입니다.

다음 링크를 확인하십시오: scraping-websites-with-curl


Rafay

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 는 수정되지 않고 결과 세트를 계속해서 재사용할 수 있습니다. 아마도 훨씬 더 많은 지식을 가진 누군가가 이것을 조금 지울 수 있지만 기본적으로 내가 찾은 것에서와 같습니다.


Christopher Thomas

Advanced Html Dom 은 동일한 인터페이스를 제공하는 간단한 HTML DOM 대체품이지만 DOM 기반이므로 관련 메모리 문제가 발생하지 않습니다.

또한 jQuery 확장을 포함한 전체 CSS 지원이 있습니다.


Community Wiki

HTML5의 경우 html5 lib는 수년 동안 중단되었습니다. 최근 업데이트 및 유지 관리 기록에서 찾을 수 있는 유일한 HTML5 라이브러리는 1주일 전에 베타 1.0으로 가져온 html5-php입니다.


Community Wiki

PHPPowertools/DOM-Query 라는 라이브러리를 만들었습니다. 이 라이브러리를 사용하면 jQuery를 사용하는 것처럼 HTML5 및 XML 문서를 크롤링할 수 있습니다.

내부적으로 CSS 선택기를 XPath 선택기로 변환하기 위해 symfony/DomCrawler를 사용합니다. 적절한 성능을 보장하기 위해 한 개체를 다른 개체로 전달할 때에도 항상 동일한 DomDocument를 사용합니다.


사용 예:

 namespace PowerTools; // Get file content $htmlcode = file_get_contents('https://github.com'); // Define your DOMCrawler based on file string $H = new DOM_Query($htmlcode); // Define your DOMCrawler based on an existing DOM_Query instance $H = new DOM_Query($H->select('body')); // Passing a string (CSS selector) $s = $H->select('div.foo'); // Passing an element object (DOM Element) $s = $H->select($documentBody); // Passing a DOM Query object $s = $H->select( $H->select('p + p')); // Select the body tag $body = $H->select('body'); // Combine different classes as one selector to get all site blocks $siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer'); // Nest your methods just like you would with jQuery $siteblocks->select('button')->add('span')->addClass('icon icon-printer'); // Use a lambda function to set the text of all site blocks $siteblocks->text(function( $i, $val) { return $i . " - " . $val->attr('class'); }); // Append the following HTML to all site blocks $siteblocks->append('<div class="site-center"></div>'); // Use a descendant selector to select the site's footer $sitefooter = $body->select('.site-footer > .site-center'); // Set some attributes for the site's footer $sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see')); // Use a lambda function to set the attributes of all site blocks $siteblocks->attr('data-val', function( $i, $val) { return $i . " - " . $val->attr('class') . " - photo by Kelly Clark"; }); // Select the parent of the site's footer $sitefooterparent = $sitefooter->parent(); // Remove the class of all i-tags within the site's footer's parent $sitefooterparent->select('i')->removeAttr('class'); // Wrap the site's footer within two nex selectors $sitefooter->wrap('<section><div class="footer-wrapper"></div></section>'); [...]

지원되는 방법:


  1. 명백한 이유로 'select'로 이름이 변경되었습니다.
  2. 'empty'는 PHP에서 예약어이므로 'void'로 이름이 변경되었습니다.

노트 :

라이브러리에는 PSR-0 호환 라이브러리를 위한 자체 구성이 필요 없는 자동 로더도 포함되어 있습니다. 포함된 예제는 추가 구성 없이 즉시 사용할 수 있습니다. 또는 작곡가와 함께 사용할 수 있습니다.


Community Wiki

GB 파일을 쉽게 처리할 수 있는 범용 XML 파서를 작성했습니다. XMLReader를 기반으로 하며 사용이 매우 쉽습니다.

 $source = new XmlExtractor("path/to/tag", "/path/to/file.xml"); foreach ($source as $tag) { echo $tag->field1; echo $tag->field2->subfield1; }

다음은 github 리포지토리입니다. XmlExtractor


Community Wiki

시도할 수 있는 또 다른 옵션은 QueryPath 입니다. jQuery에서 영감을 얻었지만 PHP의 서버에서 Drupal 에서 사용됩니다.


Ric

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


CesarB

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


troelskn

HTML/XML DOM을 처리하는 방법에는 여러 가지가 있으며 그 중 대부분이 이미 언급되었습니다. 따라서 나는 그것들을 직접 나열하려고 하지 않을 것입니다.

나는 개인적으로 DOM 확장을 사용하는 것을 선호하며 그 이유를 추가하고 싶습니다.

  • ii 기본 C 코드의 성능 이점을 최적으로 사용합니다.
  • 그것은 OO PHP입니다 (그리고 그것을 하위 분류 할 수 있습니다)
  • 다소 낮은 수준입니다(보다 고급 동작을 위해 부풀리지 않은 기초로 사용할 수 있음)
  • DOM의 모든 부분에 대한 액세스를 제공합니다(예: 덜 알려진 XML 기능을 무시하는 SimpleXml과 달리).
  • 기본 Javascript에서 사용되는 구문과 유사한 DOM 크롤링에 사용되는 구문이 있습니다.

DOMDocument CSS 선택기를 사용 querySelectorAll DOMDocument 서브클래싱하고 JS와 유사한 querySelectorAll 및 querySelector 메서드를 서브클래스에 추가하는 이 기능을 추가하는 다소 간단하고 편리한 방법이 있습니다.

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

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

아래 코드는 내 DOM 쿼리 라이브러리 에서 바로 나와 내가 설명한 기술을 사용합니다.

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의 제작자 Fabien Potencier가 Symfony용 CssSelector 구성 요소를 만들기로 결정한 것과 사용 방법에 대해 CSS 선택기를 사용하여 XML 문서 구문 분석을 참조하십시오.


Community Wiki

Symfony 프레임워크에는 HTML을 구문 분석할 수 있는 번들이 있으며 XPath 를 사용하는 대신 CSS 스타일을 사용하여 DOM 을 선택할 수 있습니다.


Tuong Le

FluidXML 을 사용하면 XPathCSS 선택기를 사용하여 XML을 쿼리하고 반복할 수 있습니다.

 $doc = fluidxml('<html>...</html>'); $title = $doc->query('//head/title')[0]->nodeValue; $doc->query('//body/p', 'div.active', '#bgId') ->each(function($i, $node) { // $node is a DOMNode. $tag = $node->nodeName; $text = $node->nodeValue; $class = $node->getAttribute('class'); });

https://github.com/servo-php/fluidxml


Community Wiki

세 줄로 된 XML의 JSON 및 배열:

 $xml = simplexml_load_string($xml_string); $json = json_encode($xml); $array = json_decode($json,TRUE);

타다!


Community Wiki

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/")));

Community Wiki

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;

Community Wiki

xml 구문 분석을 위한 가장 좋은 방법:

 $xml='http://www.example.com/rss.xml'; $rss = simplexml_load_string($xml); $i = 0; foreach ($rss->channel->item as $feedItem) { $i++; echo $title=$feedItem->title; echo '<br>'; echo $link=$feedItem->link; echo '<br>'; if($feedItem->description !='') { $des=$feedItem->description; } else { $des=''; } echo $des; echo '<br>'; if($i>5) break; }

Community Wiki

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

 <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 또는 누락된 따옴표를 허용합니다.


Community Wiki

출처 : http:www.stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php

반응형