programing

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

yoursource 2022. 9. 17. 22:26
반응형

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

HTML/XML을 해석하고 정보를 추출하려면 어떻게 해야 합니까?

네이티브 XML 확장자

네이티브 XML 확장자 중 하나를 사용하는 것을 선호합니다. 왜냐하면 그것들은 PHP에 번들되어 있고, 보통 서드 파티의 모든 lib보다 빠르고, 마크업에 필요한 모든 제어가 가능하기 때문입니다.

DOM 확장 기능을 사용하면 PHP 5에서 DOM API를 통해 XML 문서를 조작할 수 있습니다.W3C의 Document Object Model Core Level 3을 구현한 것으로, 플랫폼 및 언어에 구애받지 않는 인터페이스로 프로그램 및 스크립트가 문서의 내용, 구조 및 스타일에 동적으로 액세스하여 갱신할 수 있습니다.

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

DOM을 사용하여 생산성을 얻으려면 시간이 좀 걸리지만 IMO는 충분히 가치가 있습니다.DOM은 언어에 구애받지 않는 인터페이스이기 때문에 여러 언어로 구현되어 있기 때문에 프로그래밍 언어를 변경해야 할 경우 해당 언어의 DOM API를 사용하는 방법을 이미 알고 있을 것입니다.

DOM 확장의 사용 방법은 StackOverflow에서 폭넓게 다루어져 있기 때문에 이 확장 기능을 사용하는 경우 스택 오버플로를 검색/브라우징하는 것으로 대부분의 문제를 해결할 수 있습니다.

기본적인 사용 예시와 일반적인 개념적 개요는 다른 답변에서도 볼 수 있습니다.

XMLReader

XMLReader 확장은 XML 풀 파서입니다.판독기는 문서 스트림에서 전진하고 도중에 각 노드에서 정지하는 커서 역할을 합니다.

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

기본적인 사용 예는 다른 답변에서 볼 수 있습니다.

XML 파서

이 확장을 사용하면 XML 파서를 만든 다음 다른 XML 이벤트에 대한 핸들러를 정의할 수 있습니다.각 XML 파서에는 조정할 수 있는 몇 가지 파라미터도 있습니다.

XML 파서 라이브러리는 libxml을 기반으로 하며 SAX 스타일의 XML 푸시 파서를 구현합니다.메모리 관리에는 DOM이나 SimpleXML보다 좋은 선택이지만 XMLReader에 의해 구현된 풀파서보다 사용하기 어렵습니다.

SimpleXml

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

SimpleXML은 HTML이 유효한 XHTML이라는 것을 알고 있는 경우 옵션입니다.파손된HTML을 해석할 필요가 있는 경우는, SimpleXml을 고려하지 말아 주세요.

기본적인 사용 예를 이용할 수 있으며, PHP 매뉴얼에는 많은 추가 예가 있습니다.


서드파티 라이브러리(libxml 기반)

서드파티 lib를 사용하는 경우 문자열 해석 대신 실제로 아래에 DOM/libxml사용하는 lib를 사용하는 것이 좋습니다.

FluentDom

FluentDOM은 PHP의 DOMDocument에 jQuery와 같은 fluent XML 인터페이스를 제공합니다.실렉터는 XPath 또는 CSS로 작성됩니다(CSS-to-XPath 컨버터 사용).현재 버전은 표준 인터페이스를 구현하는 DOM을 확장하고 DOM Living Standard에서 기능을 추가합니다.FluentDOM은 JSON, CSV, JsonML, Rabbit Fish 등의 형식을 로드할 수 있습니다.Composer를 통해 설치할 수 있습니다.

Html PageDom

Wa72\HtmlPageDom는 DOM을 사용하여 HTML 문서를 쉽게 조작할 수 있는 PHP 라이브러리입니다.DOM 트리를 통과하기 위해 Symfony2 컴포넌트의 DomainCrawler가 필요하며 HTML 문서의 DOM 트리를 조작하는 방법을 추가하여 확장합니다.

phpQuery

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

이는 "포기 및 버그: 사용자의 책임 하에 사용"이라고 설명되지만 유지보수는 최소한으로 유지되고 있는 것으로 보입니다.

라미나스돔

그 Laminas\라미나스\Dom 구성 요소(이전에 Zend_DOM)DOM문서와 구조 작업을 위한 도구를 제공합니다.돔 컴포넌트(이전의 Zend_DOM)는 DOM문서 및 구조 작업을 위한 도구를 제공합니다.현재, 우리는 현재, 델은을 제공하Laminas\Dom\Query, DOM문서 둘 다 XPath및 전투 근무 지원 선발을 활용한 쿼리 하기 위한 통일된 인터페이스를 제공합니다.는 XPath실렉터와 전투 근무 지원 모두사용하여 DOM문서를 조회하기 위한 통합 인터페이스를 제공합니다 실렉터를.

이 패키지는 기능이 완료된 것으로 간주되며 현재 보안 전용 유지 보수 모드에 있습니다.

기능

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을 기반으로 구축하면 네이티브 확장을 기반으로 하므로 개봉 즉시 뛰어난 성능을 얻을 수 있습니다.단, 모든 서드파티제의 lib가 이 경로를 따르는 것은 아닙니다.그 중 일부는 다음과 같습니다.

PHP Simple HTML DOM 파서

  • HTML DOM 파서를 PHP5+로 작성하면 HTML을 쉽게 조작할 수 있습니다!
  • PHP 5+가 필요합니다.
  • 유효하지 않은 HTML을 지원합니다.
  • jQuery와 마찬가지로 선택기가 있는 HTML 페이지에서 태그를 찾습니다.
  • HTML에서 콘텐츠를 한 줄로 추출합니다.

일반적으로 이 파서는 추천하지 않습니다.코드베이스가 형편없고 파서 자체가 느리고 메모리가 부족합니다.일부 jQuery Selector(예: 자식 선택기)를 사용할 수 없습니다.libxml 기반 라이브러리는 이 성능을 쉽게 능가합니다.

PHP HTML 파서

PHPhtmlParser는 jQuery와 같은 임의의 css 셀렉터를 사용하여 태그를 선택할 수 있는 단순하고 유연한 HTML 파서입니다.목표는 html의 유효 여부를 불문하고 빠르고 쉬운 스크래핑 방법을 필요로 하는 툴 개발을 지원하는 것입니다.이 프로젝트는 원래 sunra/php-simple-html-dom-parser에 의해 지원되었지만 지원이 중단된 것 같아 그의 전작을 각색한 프로젝트입니다.

다시 말씀드리지만 이 파서는 추천하지 않습니다.CPU 사용률이 높기 때문에 다소 느립니다.작성된 DOM 객체의 메모리를 클리어하는 기능도 없습니다.이러한 문제는 특히 중첩된 루프에 의해 확대됩니다.문서 자체는 부정확하고 철자가 틀려 4월 16일 이후 수정에 대한 응답이 없습니다.


HTML 5

HTML5의 해석에는 위의 내용을 사용할 수 있지만 HTML5가 허용하는 마크업으로 인해 기호가 발생할 수 있습니다.따라서 HTML5의 경우 전용 파서를 사용하는 것이 좋습니다.이것들은 PHP로 쓰여져 있기 때문에, 낮은 레벨의 언어로 컴파일 된 확장자에 비해, 퍼포먼스가 저하해, 메모리 사용량이 증가하는 것에 주의해 주세요.

HTML5Dom 문서

HTML5DOMDocument는 네이티브 DOMDocument 라이브러리를 확장합니다.몇 가지 버그를 수정하고 새로운 기능을 추가합니다.

  • html 엔티티 유지(DOMDocument는 유지하지 않음)
  • 보이드 태그 유지(DOMDocument는 유지하지 않음)
  • 올바른 부품을 올바른 위치로 이동하는 HTML 코드를 삽입할 수 있습니다(헤드 요소는 머리에 삽입하고 바디 요소는 몸에 삽입).
  • 전투 근무 지원 선발과(현재:전투 근무 지원 셀렉터를 사용하여 DOM을 조회할 수 있습니다(현재 사용 가능 이용할 수 있는 DOM에 쿼리 하지: 할 수 있다.*,tagname,tagname#id,#id,tagname.classname,.classname,tagname.classname.classname2,.classname.classname2,tagname[attribute-selector],[attribute-selector],div, p,div p,div > p,div + p그리고 ,그리고.p ~ ul.)
  • element-> class List 지원을 추가합니다.
  • 요소 -> 내부 지원을 추가합니다.HTML.
  • 요소 ->외부 지원을 추가합니다.HTML.

HTML5

HTML5는 표준 준거 HTML5 파서이며 PHP로 작성되어 있습니다.안정적이고 많은 제작 웹사이트에서 사용되고 있으며 다운로드 수가 5백만 건을 훨씬 넘습니다.

HTML5는 다음과 같은 기능을 제공합니다.

  • HTML5 시리얼라이저
  • PHP 네임스페이스 지원
  • Composer 지원
  • 이벤트 기반(SAX 유사) 파서
  • DOM 트리 빌더
  • Query Path와의 상호 운용성
  • PHP 5.3.0 이상에서 실행

정규 표현

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

마크업과 일치하는 웹 조각은 대부분 깨지기 쉽습니다.대부분의 경우 이들은 HTML의 특정 부분에서만 작동합니다. 어딘가에 공백을 추가하거나 태그에서 속성을 추가하거나 변경하는 등의 작은 마크업 변경은 RegEx가 올바르게 작성되지 않을 때 실패할 수 있습니다.HTML에서 RegEx를 사용하기 전에 무엇을 하고 있는지 알아야 합니다.

HTML 파서는 HTML의 구문 규칙을 이미 알고 있습니다. 정규 표현은 새로 쓰는 RegEx마다 가르쳐야 합니다.RegEx는 경우에 따라 다르지만 실제로 사용 사례에 따라 달라집니다.

보다 신뢰할 수 있는 파서를 쓸 수 있지만, 정규 표현식을 사용하여 완전하고 신뢰할 수 있는 커스텀 파서를 쓰는 것은 앞서 말한 라이브러리가 이미 존재하고 이 문제를 훨씬 더 잘 처리할 수 있는 시간 낭비입니다.

'Html Cthulhu Way 구문 분석'도 참조하십시오.


책들

돈을 좀 쓰고 싶다면, 한번 보세요.

저는 PHP 아키텍트나 저자와 관련이 없습니다.

Simple HTML DOM 파서사용해 보십시오.

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

DOMDocument-> load를 사용합니다.HTML() 및 be done it.libxml의 HTML 해석 알고리즘은 매우 좋고 빠릅니다.일반적인 생각과는 달리 부정한 형식의 HTML에서는 초크하지 않습니다.

안 되고 언제 정규 표현을 써야 하죠?

먼저, 일반적인 오칭입니다.정규식은 HTML을 "파싱"하기 위한 것이 아닙니다. 그러나 정규식은 데이터를 "추출"할 수 있습니다.추출은 그들이 원하는 것이다.적절한 SGML 툴킷 또는 베이스라인 XML 파서에 대한 regex HTML 추출의 주요 단점은 구문적인 노력과 다양한 신뢰성입니다.

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

<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순회 frontends 많은 DOM트래버설프런트 엔드에서는 HTML표시되지 않습니다 코멘트가 HTML코멘트를 밝히지 않았다.<!--추출, 하지만은 더 유용한 앵커들.그러나 때로는 추출에 더 유용한 앵커이기도 합니다.특정pseudo-HTML 변화에서 의사-HTML 변형 특히.<$var>아니면 SGML잔류물 regexps과 길들이기 쉽다.또는 표준 마크업 언어 규약 잔류물은길들이기 쉽다 regexps로.
  • 대부분의 경우 정규 표현식은 사후 처리를 저장할 수 있습니다.그러나 HTML 엔티티는 수동 관리가 필요한 경우가 많습니다.
  • 마지막으로 <img src= url> 추출과 같은 매우 간단한 작업의 경우 실제로 툴이 될 수 있습니다.SGML/XML 파서보다 빠른 속도는 이러한 기본적인 추출 절차에서 주로 발휘됩니다.

그것은 때때로 심지어 HTML의 풀과 가위로 편집하는정규 표현을 사용하여 HTML의추출하는 것이 좋습니다 미리 일부를는 정규식을 사용하여 pre-extract 것을 충고합니다./<!--CONTENT-->(.+?)<!--END-->/나머지는 간단한 HTML 파서 프런트엔드를 사용하여 처리합니다.

주의: 실제로 XML 구문 분석과 정규 표현을 번갈아 사용하는 앱이 있습니다.바로 지난주에 PyQuery 파싱이 중단되었고 regex는 여전히 작동했습니다.네, 이상해요, 저도 설명할 수 없어요.하지만 그렇게 됐어.
따라서 regex=devil meme와 일치하지 않는다고 해서 실제 고려 사항을 부정하지 마십시오.하지만 이것 또한 너무 많이 투표하지는 말자. 이것은 이 주제에 대한 편파적인 표현일 뿐이다.

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

phpQueryQueryPath는 fluent jQuery API 복제에서 매우 유사합니다.이것이 바로 PHP에서 HTML을 적절히 해석하기 위한 가장 쉬운 접근법 중 두 가지 이유입니다.

Query Path 예시

기본적으로 먼저 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");
 }

간단한 것을 합니다.#id ★★★★★★★★★★★★★★★★★」.class ★★★★★★★★★★★★★★★★★」DIV->find()그러나 XPath 문을 사용할 수도 있습니다.이것이 더 빠를 수 있습니다.또한 일반적인 jQuery 메서드는 다음과 같습니다.->children() ★★★★★★★★★★★★★★★★★」->text() ★★★★★★★★★★★★★★★★★.->attr()올바른 HTML 스니펫 추출을 단순화합니다(또한 해당 SGML 엔티티가 이미 디코딩되어 있습니다).

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

도 있습니다(QueryPath).->append된 문서 「」 「」 「」 「」 「」)를 출력해, 합니다.->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")
  • 적절한 데이터 이스케이프 없음(정규 표현 그리핑과 비교)

심플한 HTML DOM은 뛰어난 오픈 소스 파서입니다.

simplehtmldom 입니다.소스 포트

오브젝트 지향적인 방법으로 DOM 요소를 처리하며, 새로운 반복에서는 비준수 코드에 대한 커버 범위가 넓어집니다.또한 태그 이름의 모든 요소를 반환하는 "find" 함수 등 JavaScript에서 볼 수 있는 몇 가지 훌륭한 기능도 있습니다.

다양한 종류의 웹 페이지에서 테스트하고 여러 가지 툴에서 사용해 왔습니다만, 매우 효과가 있다고 생각합니다.

여기서 본 적이 없는 일반적인 접근법은 Tidy를 통해 HTML을 실행하는 것입니다.Tidy는 유효한 XHTML을 뱉도록 설정할 수 있습니다.그러면 오래된 XML 라이브러리를 사용할 수 있습니다.

다만, 구체적인 문제에 대해서는, 이 프로젝트를 봐 주세요.http://fivefilters.org/content-only/ 는, 페이지의 텍스트 컨텐츠(헤더나 바닥글이 아닌)만을 추출하도록 설계된, 가독성 알고리즘의 수정 버전입니다.

1a와 2: 새로운 Symfony Componentet 클래스 DOMCrawler(DomCrawler)에 투표합니다.이 클래스에서는 CSS 셀렉터와 유사한 쿼리를 허용합니다.이 프레젠테이션을 통해 실제 예시를 살펴보십시오. News-of-The-Symfony 2-world.

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

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

참고로 이것은 일반적으로 스크린 스크래핑이라고 불립니다.제가 사용한 라이브러리는 Simple HTML Dom Parser입니다.

우리는 이전에 우리의 필요에 따라 꽤 많은 크롤러를 만들어 왔다.결국, 가장 잘 하는 것은 보통 간단한 정규 표현이다.위에 나열된 라이브러리가 작성되는 이유는 좋지만, 원하는 것이 무엇인지 알고 있다면 정규 표현을 사용하는 것이 더 안전합니다. 비활성 HTML/XHTML 구조도 처리할 수 있기 때문에 대부분의 파서를 통해 로드되면 실패합니다.

PHP Simple HTML DOM 파서를 추천합니다.

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

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

이것은 W3C XPath 테크놀로지에 대한 훌륭한 작업 설명으로 들립니다."return all"과 같은 질문은 쉽게 표현할 수 있습니다.hrefimg <foo><bar><baz> elements"PHP 버퍼가 아니기 때문에 어떤 형태로 XPath를 사용할 수 있는지 말씀드릴 수 없습니다.HTML 파일을 처리하기 위해 외부 프로그램을 호출할 수 있다면 XPath 명령줄 버전을 사용할 수 있습니다.간단한 소개에 대해서는, http://en.wikipedia.org/wiki/XPath 를 참조해 주세요.

문자열 해석 대신 DOM을 사용하는 SimpleHtmlDom의 서드파티 대체: phpQuery, Zend_Dom, QueryPathFluentDom.

네, 그 목적으로 simple_html_dom을 사용할 수 있습니다.그러나 특히 웹 스크랩을 위해 simple_html_dom과 많은 작업을 해 본 결과 너무 취약하다는 것을 알게 되었습니다.기본은 맞지만 어쨌든 추천은 안 할 거예요.

저는 컬을 사용한 적이 없지만, 컬이 훨씬 더 효율적으로 일을 할 수 있고 훨씬 더 견고하다는 것을 배웠습니다.

다음 링크를 확인해 주십시오.craping-website-with-curl

Query Path는 좋지만, "트래킹 상태"에 주의해 주세요.무슨 일이 일어났는지, 왜 코드가 동작하지 않는지를 알아내려고 하면 디버깅에 많은 시간을 낭비할 수 있기 때문입니다.

즉, 결과 세트 상의 각 콜은 오브젝트 내의 결과 세트를 변경합니다.각 링크가 새로운 세트인 jquery와 같이 체인할 수 없으며 쿼리의 결과인 단일 세트가 있으며 각 함수 콜이 해당 단일 세트를 수정합니다.

jquery와 같은 동작을 얻으려면 필터나 filter와 같은 동작을 하기 전에 분기해야 합니다.이것은 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수정되지 않고 결과 세트를 몇 번이고 재사용할 수 있습니다.아마도 더 많은 지식을 가진 사람이 이 문제를 해결할 수 있을 것입니다만, 기본적으로는 제가 발견한 바로는 이렇습니다.

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

또한 jQuery 확장자를 포함한 완전한 CSS도 지원합니다.

HTML5의 경우 html5 lib는 몇 년째 사용되지 않고 있습니다.최신 업데이트 및 유지 보수 기록에서 찾을 수 있는 유일한 HTML5 라이브러리는 일주일 전에 베타 1.0으로 이행된 html5-php입니다.

PHPowertools/DOM-Query라는 이름의 라이브러리를 만들었습니다.이 라이브러리는 jQuery에서처럼 HTML5 및 XML 문서를 크롤링할 수 있습니다.

후드 아래에서는 CSS 셀렉터를 XPath 셀렉터로 변환하기 위해 Symfony/DomCrawler를 사용합니다.한 개체를 다른 개체로 전달할 때도 항상 동일한 DominoDocument를 사용하여 성능이 우수합니다.


사용 예:

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 호환 라이브러리 전용 제로 구성 오토로더도 포함되어 있습니다.여기에 기재되어 있는 예는 추가 설정 없이 바로 사용할 수 있습니다.또는 작곡가와 함께 사용할 수도 있습니다.

HTML Tidy 등의 기능을 사용하여 "파손된" HTML을 정리하고 HTML을 XHTML로 변환하여 XML 파서로 해석할 수 있습니다.

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 repo: Xml Extractor

다른 옵션은 QueryPath입니다.jQuery에서 영감을 얻었지만 PHP 서버에서 Drupal에서 사용되었습니다.

XML_HTMLSax 더 이상 유지되지 않더라도 안정적입니다.또 다른 옵션은 HTML을 Html Tidy를 통해 파이핑한 후 표준 XML 도구를 사용하여 해석하는 것입니다.

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

저는 개인적으로 DOM 확장자를 사용하는 것을 선호하며, 그 이유는 다음과 같습니다.

  • 기본 C 코드의 퍼포먼스 이점을 최적으로 활용합니다.
  • OOO PHP입니다(하위 분류 가능).
  • 다소 낮은 수준(고급 동작을 위한 비표준 기반으로 사용할 수 있음)
  • DOM 의 모든 부분에 액세스 할 수 있습니다(예를 들어, DOM 와는 다릅니다).SimpleXml: 잘 알려지지 않은 XML 기능의 일부를 무시합니다.)
  • 이것은 네이티브 Javascript에서 사용되는 구문과 유사한 DOM 크롤링에 사용되는 구문을 가지고 있습니다.

CSS 할 수 있는 .DOMDocument한 방법이 있습니다.즉, 「」를 분류하는 입니다.DOMDocument JS 추가querySelectorAll ★★★★★★★★★★★★★★★★★」querySelector이치노

셀렉터를 해석할 때는 Symfony 프레임워크의 매우 미니멀한 CssSelector 컴포넌트를 사용하는 것을 권장합니다.이 컴포넌트는 CSS 셀렉터를 XPath 셀렉터로 변환하기만 하면 됩니다.XPath 셀렉터는 이 컴포넌트를 사용하여DOMXpath노들리스트

그런 다음 매우 낮은 수준의 이 서브클래스를 매우 특정 유형의 XML을 구문 분석하거나 jQuery와 유사한 동작을 추가하는 등 보다 높은 수준의 클래스의 기반으로 사용할 수 있습니다.

아래 코드는 내 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 Potensier의 CSS 셀렉터를 사용한 XML 문서 해석도 참조하십시오.

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

FluidX 탑재ML은 XPath 및 CSS Selector사용하여 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

XML로부터의 JSON 및 어레이를 3행으로 나타냅니다.

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

짜잔!

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

HTML5DOMDocument라는 라이브러리를 만들었습니다.이 라이브러리는 https://github.com/ivopetkov/html5-dom-document-php에서 무료로 이용하실 수 있습니다.

쿼리 셀렉터도 지원하므로 귀하의 경우 매우 도움이 될 것입니다.다음은 코드 예시입니다.

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

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

jQuery 셀렉터에 익숙한 사용자는 Scarlets를 사용할 수 있습니다.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 또는 누락된 따옴표도 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php

반응형