DOMDocument для разбора HTML (вместо регулярного выражения)

Я пытаюсь изучить DOMDocument для анализа HTML-кода.

Я просто делаю простую работу, мне уже понравился ответ Гордона на данные об утилизации с использованием regex и simplehtmldom и основал мой код на его работе.

Я нашел документацию на PHP.net не так хорошо из-за ограниченной информации, почти нет примеров, и большинство особенностей были основаны на анализе XML.

<?php $dom = new DOMDocument; libxml_use_internal_errors(true); $dom->loadHTMLFile('http://www.nu.nl/internet/1106541/taalunie-keurt-open-sourcewoordenlijst-goed.html'); libxml_clear_errors(); $recipe = array(); $xpath = new DOMXPath($dom); $contentDiv = $dom->getElementById('page'); // would have preferred getContentbyClass('content') (unique) in this case. # title print_r($xpath->evaluate('string(div/div/div/div/div/h1)', $contentDiv)); # content (this is not working) #print_r($xpath->evaluate('string(div/div/div/div['content'])', $contentDiv)); // if only this worked print_r($xpath->evaluate('string(div/div/div/div)', $contentDiv)); ?> 

В целях тестирования я пытаюсь получить заголовок (между тегами h1) и контент (HTML) статьи новостей nu.nl.

Как вы можете видеть, я могу получить заголовок, хотя я даже не доволен этой оценкой строки, так как это просто единственный тег h1 на этом уровне div.

Вот как вы могли это сделать с DOM и XPath:

 $dom = new DOMDocument; libxml_use_internal_errors(true); $dom->loadHTMLFile('http://www.nu.nl/…'); libxml_clear_errors(); $xpath = new DOMXPath($dom); echo $xpath->evaluate('string(id("leadarticle")/div/h1)'); echo $dom->saveHtml( $xpath->evaluate('id("leadarticle")/div[@class="content"]')->item(0) ); 

string(id("leadarticle")/div/h1) XPath string(id("leadarticle")/div/h1) вернет textContent h1, который является дочерним элементом div, который является дочерним элементом элемента с идентификатором Leadarticle.

Идентификатор XPath id("leadarticle")/div[@class="content"] вернет div с атрибутом атрибута класса, который является дочерним элементом элемента с идентификатором Leadarticle.

Поскольку вы хотите, чтобы внешнийHTML содержимого div вам нужно было извлечь весь узел, а не только контент, следовательно, функция string () в XPath . Передача узла DOMDocument::saveHTML() ( который возможен только с 5.3.6 ) затем сериализует этот узел обратно в HTML.

Вы не должны беспокоиться о необработанном интерфейсе DOMDocument. Скорее используйте один из классов стиля jQuery для извлечения. Как анализировать HTML с помощью PHP?

QueryPath работает нормально, если вы используете более конкретные селектора:

 include "qp.phar"; $qp = htmlqp("http://www.nu.nl/internet/1106541/taalunie-keurt-open-sourcewoordenlijst-goed.html"); print $qp->find(".header h1")->text(); print $qp->top()->find(".article .content")->xhtml(); 

Возможно, вам придется разбить смешанный Javascript, прежде чем ( ->find("script")->remove() ).