프로그래밍 언어/PHP

PHP에서 HTML / XML을 구문 분석하는 방법

Rateye 2021. 8. 4. 10:49
728x90
반응형

 

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

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를 사용하는 방법을 이미 알고있을 가능성이 있습니다.

기본적인 사용 예제는 Grabbing the href attribute of an A element 에서 찾을 수 있으며 일반적인 개념 개요는 php의 DOMDocument에서 찾을 수 있습니다.

DOM 확장을 사용하는 방법은 StackOverflow 에서 광범위하게 다루었으므로이를 사용하기로 선택하면 Stack Overflow를 검색 / 탐색하여 발생하는 대부분의 문제를 해결할 수 있습니다.

XMLReader

XMLReader 확장은 XML 풀 파서입니다. 리더는 문서 스트림에서 앞으로 나아가는 동안 각 노드에서 멈추는 커서 역할을합니다.

DOM과 마찬가지로 XMLReader는 libxml을 기반으로합니다. HTML 파서 모듈을 트리거하는 방법을 모르기 때문에 손상된 HTML을 파싱하기 위해 XMLReader를 사용할 가능성이 libxml의 HTML 파서 모듈을 사용하도록 명시 적으로 말할 수있는 DOM을 사용하는 것보다 덜 강력 할 수 있습니다.

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

XML Parser

이 확장을 사용하면 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 Manual에는 많은 추가 예제가 있습니다.

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

타사 lib를 사용하는 것을 선호하는 경우 문자열 구문 분석 대신 실제로 DOM / libxml을 사용하는 lib를 사용하는 것이 좋습니다.

FluentDom - Repo

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

HtmlPageDom

Wa72 \ HtmlPageDom`은 DOM 트리를 순회하기 위해 Symfony2 컴포넌트의 DomCrawler가 필요하며 HTML 문서의 DOM 트리를 조작하는 메소드를 추가하여 확장하여 HTML 문서를 쉽게 조작 할 수있는 PHP 라이브러리입니다.

phpQuery (not updated for years)

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

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

Zend_Dom

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

QueryPath

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

fDOMDocument

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

sabre/xml

sabre / xml은 XMLReader 및 XMLWriter 클래스를 래핑하고 확장하여 간단한 "xml to object / array"매핑 시스템 및 디자인 패턴을 만드는 라이브러리입니다. XML 쓰기 및 읽기는 단일 패스이므로 빠르며 큰 xml 파일에서 메모리가 부족합니다.

FluidXML

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

 

반응형

 

타사(libxml 기반 아님)

DOM / libxml을 기반으로 빌드 할 때의 이점은 기본 확장을 기반으로하기 때문에 즉시 우수한 성능을 얻을 수 있다는 것입니다. 그러나 모든 타사 라이브러리가이 경로를 따르는 것은 아닙니다. 그들 중 일부는 아래에 나열

PHP Simple HTML DOM Parser

  • PHP5 +로 작성된 HTML DOM 파서를 사용하면 매우 쉽게 HTML을 조작 할 수 있습니다!
  • PHP 5 이상이 필요합니다.
  • 잘못된 HTML을 지원합니다.
  • jQuery와 같은 선택기를 사용하여 HTML 페이지에서 태그를 찾습니다.
  • 한 줄로 HTML에서 콘텐츠를 추출합니다.

일반적으로이 파서를 권장하지 않습니다. 코드베이스는 끔찍하고 파서 자체는 다소 느리고 메모리가 부족합니다. 모든 jQuery 선택자 (예 : 자식 선택자 )가 가능한 것은 아닙니다. libxml 기반 라이브러리는 이보다 쉽게 성능을 능가해야합니다.

PHP Html Parser

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

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

Ganon

  • 범용 토크 나이저 및 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가 완성되면 더 많은 전용 파서를 볼 수 있습니다. 체크 아웃 할 가치가있는 html 5 구문 분석을위한 How-To 라는 W3의 블로그 게시물도 있습니다.

WebServices

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

ScraperWiki.

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

Regular Expressions

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

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

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

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

또한 Html The Cthulhu Way 구문 분석을 참조하십시오.

Books

돈을 쓰고 싶다면

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

출처 : https://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php
728x90
반응형