Каков наилучший способ извлечения данных из файла HTML с использованием функций PHP DOM? - PullRequest
0 голосов
/ 23 марта 2011

Мне нужно извлечь большие объемы данных из множества файлов HTML, и мне придется написать отдельный скрипт для каждого типа файла HTML, чтобы правильно проанализировать данные, которые мне нужны.

Данные будут располагаться в разных частях документа - например, в документе первого типа данные, которые мне нужны, могут находиться внутри DIV с идентификатором, но для документа второго типа единственный способ найти данные, которые я может понадобиться найти определенный шаблон тегов, которые его содержат (например, <div><b>DATA</div></b>).

Из того небольшого, что я смог найти до сих пор, кажется, что DOMXPath может помочь мне, по крайней мере, в части извлечения - какие другие функции я могу использовать, особенно во втором примере поиска произвольного шаблона тегов и получение их содержимого?

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Если вы извлекаете различные типы данных из множества файлов HTML, вы быстро устанете от использования DOMDocument API и XPath. Используйте одну из библиотек-оболочек, перечисленных в Как анализировать и обрабатывать HTML / XML в PHP? . Они предоставляют более богатый API и дополнительные селекторы.

Я предпочитаю phpQuery и QueryPath , которые позволяют:

print qp($url)->find("body p.article a")->attr("href");

print qp($html)->find("div b")->text();

Используемые функции описаны здесь: http://api.querypath.org/docs/class_query_path.html - это в основном похоже на jQuery.

0 голосов
/ 14 января 2016

Если вы планируете анализировать много HTML-файлов и вам нужно выбрать или изменить многие элементы ваших HTML-файлов, рассмотрите возможность использования библиотеки.

Я бы порекомендовал библиотеку PHPPowertools/DOM-Query, который я написал сам.Он позволяет вам (1) загрузить файл HTML, а затем (2) выбрать или изменить части вашего HTML почти так же, как вы бы это делали, если бы вы использовали jQuery в приложении внешнего интерфейса.

Пример использования:

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

[...]
...