Разбор HTML для определенной части div
Я пытаюсь получить доступ к странице HTML и получить определенное число из div, который генерируется динамически.
<span itemprop="average" content="XX"></span>
Я хочу получить "XX" как переменную, которая будет отличаться для каждой страницы.
Это делается с помощью парсинга HTML или простого preg_replace?
Спасибо
3 ответа
Если вы только начинаете заниматься очисткой, я бы порекомендовал Imacros или import.io. Я начал использовать их, когда начинал выполнять задачи очистки, и начал понимать, как все это работает немного лучше. Также очень полезно использовать cUrl с Php, когда он станет вашим лучшим другом.
Не используйте REGEX для разбора HTML. Лучший способ - использовать парсер. PHP5 поставляется с некоторыми элементами, такими как DOMDocument и DOMXPath.
Вот пример использования двух для завершения:
$html = '<html><head></head><body>
<span itemprop="average" content="XX">some text</span>
<span itemprop="not_average">other text</span>
</body></html>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query( "//span[@itemprop='average']" );
foreach ($nodelist as $node){
print $node->getAttribute('content')."<br>";
}
Единственный "улов" заключается в том, что синтаксический анализатор DOMDocument намного более ограничен, чем анализатор браузеров, и "взлетит" на некоторых страницах, извлеченных из веб-страниц.
Использование DOM обычно является лучшей идеей для подобных вещей.
$html = <<<HTML
<html>
<body>
<span itemprop="average" content="XX"></span>
</body>
</html>
HTML;
libxml_use_internal_errors(TRUE);
$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);
$content = $xpath->evaluate('string(//span[@itemprop = "average"]/@content)');
var_dump($content);
libxml_use_internal_errors () отключает вывод ошибок для плохого HTML. Вы можете использовать libxml_get_errors(), чтобы прочитать их, и libxml_clear_errors(), чтобы очистить текущий буфер ошибок.
Затем создается DOMDocument и загружается HTML. DOMDocument::loadHtmlFile() позволит загрузить его из файла или URL-адреса.
После загрузки документа вы можете создать объект DOMXpath для загруженного документа, он позволяет вам запрашивать элементы из него.
DOMXpath::valu () позволяет запрашивать списки узлов и скаляры из документа. Строка typecast внутри выражений xpath преобразует узел атрибута в строку и возвращает значение. Без преобразования типов результатом был бы список DOMNodelist, содержащий любое количество узлов DOMAttribute. При этом результатом является значение атрибута или пустая строка.