Я пытаюсь изучить 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()
).