DOMDocument для разбора HTML (вместо регулярных выражений) - PullRequest
2 голосов
/ 06 сентября 2011

Я пытаюсь научиться использовать 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.

Ответы [ 2 ]

5 голосов
/ 06 сентября 2011

Вот как вы можете сделать это с 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)
);

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

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

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

2 голосов
/ 06 сентября 2011

Вы не должны беспокоиться об интерфейсе 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()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...