Web

Как распарсить и обработать HTML/XML в PHP?

Как правильно распарсить HTML/XML и извлечь из них информацию?

Ответ 1

Встроенные расширения XML

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

 

DOM

Расширение DOM позволяет вам работать с XML-документами через DOM API с PHP 5. Это реализация W3C Document Object Model Core Level 3, независимого от платформы и языка интерфейса, который позволяет программам и скриптам динамически получать доступ и обновлять содержание, структуру и стили.

DOM может анализировать и изменять реальный (или поврежденный) HTML и выполнять запросы XPath. Он основан на libxml.

Требуется потратить некоторое время, чтобы продуктивно работать с DOM, но это того стоит. Поскольку DOM - это не зависящий от языка интерфейс, вы найдете реализации на многих языках, поэтому, если вам нужно изменить язык программирования, скорее всего, вы уже будете знать, как использовать DOM API этого языка.

 

XMLReader

Расширение XMLReader - это синтаксический анализатор XML. Reader действует как курсор, движущийся вперед по потоку документа и останавливающийся на каждом узле по пути.

XMLReader, как и DOM, основан на libxml. Я не знаю, как активировать модуль HTML-синтаксического анализатора, поэтому вероятность использования XMLReader для разбора поврежденного HTML может быть менее надежной, чем использование DOM, где вы можете явно указать, как ему использовать модуль синтаксического анализатора HTML libxml.

 

XML Parser

Это расширение позволяет создавать синтаксические анализаторы XML, а затем определять обработчики для различных событий XML. У каждого анализатора XML также есть несколько параметров, которые вы можете настроить.

Библиотека XML Parser также основана на libxml и реализует push-синтаксический анализатор XML в стиле SAX. Это может быть лучшим выбором для управления памятью, чем DOM или SimpleXML, но с ним будет труднее работать, чем с синтаксическим анализатором, реализованным в XMLReader.

 

SimpleXml

Расширение SimpleXML предоставляет очень простой и удобный в использовании набор инструментов для преобразования XML в объект, который можно обрабатывать с помощью обычных селекторов свойств и итераторов массивов.

SimpleXML - это вариант, когда вы знаете, что HTML является допустимым XHTML. Если вам нужно проанализировать поврежденный HTML, даже не рассматривайте SimpleXml, потому что он не справится.

 

Сторонние библиотеки (на основе libxml)

Если вы предпочитаете использовать стороннюю библиотеку, я бы предложил использовать библиотеку, которая фактически использует DOM/libxml на низком уровне, вместо синтаксического анализа строк.

 

FluentDom - Repo

FluentDOM предоставляет гибкий XML-интерфейс, похожий на jQuery, для DOMDocument в PHP. Селекторы написаны на XPath или CSS (с использованием конвертера CSS в XPath). Текущие версии расширяют DOM, реализуя стандартные интерфейсы, и добавляют функции из DOM Living Standard. FluentDOM может загружать такие форматы, как JSON, CSV, JsonML, RabbitFish и другие. Может быть установлен через Composer.

 

HtmlPageDom

Wa72\HtmlPageDom - это PHP-библиотека для простого управления HTML-документами. Требуется DomCrawler для Symfony2, использует обход дерева DOM и расширяет его, добавляя методы для управления деревом DOM документов HTML.

 

Zend_Dom

Zend_Dom предоставляет инструменты для работы с документами и структурами DOM. В настоящее время мы предлагаем Zend_Dom_Query, который предоставляет унифицированный интерфейс для запросов к документам DOM с использованием селекторов XPath и CSS.

 

QueryPath

QueryPath - это библиотека PHP для управления XML и HTML. Она предназначена для работы не только с локальными файлами, но и с веб-сервисами и ресурсами баз данных. Она реализует большую часть интерфейса jQuery (включая селекторы в стиле CSS), но она предназначена для использования на стороне сервера. Может быть установлена через Composer.

 

fDOMDocument

fDOMDocument расширяет стандартную модель DOM для использования исключений во всех случаях ошибок вместо предупреждений или уведомлений PHP. Она также добавляет различные пользовательские методы и ярлыки для удобства и упрощения использования DOM.

 

FluidXML

FluidXML - это библиотека PHP для управления XML с помощью краткого и понятного API. Она использует XPath и шаблон свободного программирования, что может быть увлекательным и эффективным.

 Преимущество построения на основе DOM/libxml заключается в том, что вы получаете хорошую производительность прямо из коробки, потому что эти инструменты основаны на встроенных расширениях. Однако не все сторонние библиотеки идут по этому пути. Некоторые из них перечислены ниже.

PHP Simple HTML DOM Parser

  • Парсер HTML DOM, написанный на PHP5+, позволяет очень легко манипулировать HTML!

  • Требуется PHP 5+.

  • Поддерживает поврежденный HTML.

  • Находит теги на HTML-странице с помощью селекторов, как в jQuery.

  • Извлекает содержимое из HTML в одну строку.

Я вообще не рекомендую этот парсер. Кодовая база ужасна, а сам парсер довольно медленный и требует много памяти. Не все селекторы jQuery поддержаны. Любая из библиотек на основе libxml должна легко превзойти ее.

 

PHP Html Parser

PHPHtmlParser - это простой, гибкий парсер HTML, который позволяет выбирать теги с помощью любого селектора CSS, например, jQuery. Цель состоит в том, чтобы помочь в разработке инструментов, для которых требуется быстрый и простой способ очистки HTML, независимо от того, поврежден он или нет! Этот проект изначально поддерживался sunra/php-simple-html-dom-parser, но, похоже, поддержка прекратилась, поэтому этот проект является моей адаптацией его предыдущей работы.

Опять же, я бы не рекомендовал этот парсер. Он довольно медленный при высокой загрузке процессора. Также нет функции очистки памяти созданных объектов DOM. Эти проблемы особенно проявляются при использовании вложенных циклов. Сама документация неточна и написана с ошибками.

 

Использование HTML 5

Вы можете использовать приведенные выше примеры для синтаксического анализа HTML5, но из-за особенностей разметки, допускаемой HTML5, они не всегда будут работать корректно. Поэтому, для HTML5 вы можете использовать специальный парсер, например:

html5lib

Реализации синтаксического анализатора HTML на Python и PHP на основе спецификации WHATWG HTML5 для максимальной совместимости с основными настольными веб-браузерами.

 

Веб-сервисы

Если вам не нравится программировать PHP, вы также можете использовать веб-службы. В общем, я нашел для всего один парсер.

ScraperWiki

Внешний интерфейс ScraperWiki позволяет извлекать данные в желаемой форме для использования в сети или в собственных приложениях. Также вы можете извлечь информацию о любых состояниях.

 

Регулярные выражения

И последнее и наименее рекомендованное - можно извлекать данные из HTML с помощью регулярных выражений. В целом использование регулярных выражений в HTML не рекомендуется.

Большинство фрагментов кода, которые вы найдете в интернете для соответствия разметке, некорректны. В большинстве случаев они работают только с определенными фрагментами HTML. Небольшие изменения разметки, такие как добавление пробелов, добавление или изменение атрибутов в теге, могут привести к сбою RegEx, если он неправильно написан. Вы должны знать, что делаете, прежде чем использовать RegEx в HTML.

Парсеры HTML уже имеют синтаксические правила HTML. Регулярные выражения необходимо обучать для каждого конкретного случая. В некоторых случаях RegEx подходят, но это действительно зависит от вашего варианта использования.

 

Ответ 2

phpQuery и QueryPath очень похожи на jQuery API. Вот почему это два самых простых подхода к правильному синтаксическому анализу HTML в PHP.

Примеры для QueryPath

Обычно вы сначала создается запрашиваемое дерево DOM из строки HTML:

 $qp = qp("<html><body><h1>title</h1>...");

 

Результирующий объект содержит полное древовидное представление HTML-документа. Его можно обойти с помощью методов DOM. Но общий подход - использовать селекторы CSS, как в jQuery:

 $qp->find("div.classname")->children()->...;

 

 foreach ($qp->find("p img") as $img) {

     print qp($img)->attr("src");

 }

 

В основном вы можете использовать простые селекторы тегов #id И .class ИЛИ DIV для ->find(). Но вы также можете использовать операторы XPath, которые иногда работают быстрее. Также типичные методы jQuery, такие как ->children(),  ->text()->attr(), упрощают извлечение нужных фрагментов HTML (и их объекты SGML уже декодированы).

 $qp->xpath("//div/p[1]"); 

 

QueryPath также позволяет вставлять новые теги в поток ( ->append), а затем выводить и оформлять обновленный документ ( ->writeHTML). Он может не только анализировать поврежденный HTML, но и различные диалекты XML (с пространствами имен), и даже извлекать данные из микроформатов HTML (XFN, vCard).

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

 

phpQuery или QueryPath?

Обычно QueryPath лучше подходит для работы с документами. Хотя phpQuery также реализует некоторые псевдо-методы AJAX (только HTTP-запросы), чтобы они больше напоминали jQuery. Говорят, что phpQuery часто быстрее, чем QueryPath (из-за меньшего количества общих функций).

Преимущества

  • Простота и надежность
  • Простые в использовании альтернативы ->find("a img, a object, div a")
  • Правильное неэкранирование данных (по сравнению с grepping регулярным выражением)

Схожие статьи

Как обойти блокировку интернета на работе и зайти на нужные сайты?
Web

Как обойти блокировку интернета на работе и зайти на нужные сайты?

Web

Что такое stdClass в PHP?

HTML тег <teхtarea>: высота, как выставить значение, свойства
Web

HTML тег : высота, как выставить значение, свойства

Goo.gl: что это за ссылки, откуда они берутся и стоит ли им доверять?
Web

Goo.gl: что это за ссылки, откуда они берутся и стоит ли им доверять?

×