Как вы анализируете и обрабатываете HTML/XML в PHP?


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

Author: RobertPitt, 2010-08-26

29 answers

Собственные расширения XML

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

ДОМ

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

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

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

Базовый пример использования можно найти в Захвате атрибута href элемента A, а общий концептуальный обзор можно найти в DOMDocument в php

Как использовать расширение DOM, подробно описано в StackOverflow, поэтому, если вы решите его использовать, вы можете быть уверены, что большинство проблем, с которыми вы столкнетесь, можно решить путем поиска/просмотра стека Переполнение.

Средство чтения XmlReader

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

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

Базовый пример использования можно найти по адресу получение всех значений из тегов h1 с помощью php

Анализатор XML

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

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

СИмплекСml

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

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

Базовый пример использования можно найти в Простая программа для определения узлов и значений узлов xml-файла , и в руководстве по PHP есть множество дополнительных примеров.


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

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

Свободное владение

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

Htmlпагедом

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

PhpQuery (не обновлялся годами)

PhpQuery - это серверный, цепной, управляемый селектором CSS3 API объектной модели документа (DOM), основанный на библиотеке JavaScript jQuery, написанной на PHP5, и предоставляющий дополнительный интерфейс командной строки (CLI).

Также см.: https://github.com/electrolinux/phpquery

Зенд_дом

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

Путь запроса

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

Документ fdomdocument

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

Сабля/xml

Sabre/xml - это библиотека, которая обертывает и расширяет классы XmlReader и XmlWriter для создания простой системы отображения "xml в объект/массив" и шаблона проектирования. Запись и чтение XML выполняется за один проход, поэтому они могут быть быстрыми и требуют мало памяти для больших XML-файлов.

Жидкокристаллический

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


Сторонний (не основанный на libxml)

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

PHP Простой HTML DOM парсер

  • Синтаксический анализатор HTML DOM, написанный на PHP5+, позволяет очень легко манипулировать HTML!
  • Требуется PHP 5+.
  • Поддерживает недопустимый HTML.
  • Найдите теги на HTML-странице с помощью селекторов, подобных jQuery.
  • Извлеките содержимое из HTML в одну строку.

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

Синтаксический анализатор PHP Html

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

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

Ганон

  • Универсальный токенизатор и анализатор DOM HTML/XML/RSS
    • Способность манипулировать элементами и их атрибуты
    • Поддерживает недопустимые HTML и UTF8
  • Может выполнять расширенные CSS3-подобные запросы к элементам (например, jQuery - поддерживаются пространства имен)
  • HTML-улучшитель (например, HTML-аккуратный)
    • Минимизировать CSS и Javascript
    • Сортировать атрибуты, изменять регистр символов, исправлять отступы и т.д.
  • Расширяемый
    • Анализ документов с использованием обратных вызовов на основе текущих символ/токен
    • Операции, разделенные на более мелкие функции для легкого переопределения
  • Быстро и легко

Никогда им не пользовался. Не могу сказать, хорошо ли это.


HTML 5

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

Html5lib

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

Мы можем увидеть больше выделенных парсеров, как только HTML5 будет завершен. Существует также сообщение в блоге W3 под названием Практическое руководство по синтаксическому анализу html 5, которое стоит проверить.


Веб-сервисы

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

YQL

Веб-служба YQL позволяет приложениям запрашивать, фильтровать и объединять данные из разных источников в Интернете. Операторы YQL имеют синтаксис, подобный SQL, знакомый любому разработчику, имеющему опыт работы с базами данных.

Скрепервики.

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


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

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

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

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

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

Также смотрите Синтаксический анализ Html Способом Ктулху


Книги

Если вы хотите потратить немного денег, взгляните на

Я не связан с PHP Architect или авторами.

 1749
Author: Gordon, 2018-02-03 18:57:44

Попробуйте Простой синтаксический анализатор HTML DOM

  • Синтаксический анализатор HTML DOM, написанный на PHP 5+, который позволяет вам очень легко манипулировать HTML!
  • Требуется PHP 5+.
  • Поддерживает недопустимый HTML.
  • Найдите теги на HTML-странице с помощью селекторов, таких как jQuery.
  • Извлеките содержимое из HTML в одну строку.
  • Скачать


Примеры:

Как получить HTML элементы:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';


Как изменить элементы HTML:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html;


Извлечение содержимого из HTML:

// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;


Соскабливающая косая черта:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);
 310
Author: Naveed, 2015-10-28 17:41:16

Просто используйте DOMDocument->loadHTML() и покончите с этим. алгоритм синтаксического анализа HTML libxml довольно хорош и быстр, и, вопреки распространенному мнению, не задыхается от искаженного HTML.

 224
Author: Edward Z. Yang, 2008-11-26 20:02:44

Почему вы не должны и когда вы должны использовать регулярные выражения?

Во-первых, распространенное неправильное название: Регулярные выражения не предназначены для " синтаксический анализ" HTML. Однако регулярные выражения могут " извлечь" данные. Извлечение - это то, для чего они созданы. Основным недостатком извлечения регулярных выражений HTML по сравнению с надлежащими наборами инструментов SGML или базовыми синтаксическими анализаторами XML являются их синтаксические усилия и различная надежность.

Учтите, что создание несколько надежного HTML регулярное выражение извлечения:

<a\s+class="?playbutton\d?[^>]+id="(\d+)".+?    <a\s+class="[\w\s]*title
[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?

Намного менее читаем, чем простой эквивалент phpQuery или QueryPath:

$div->find(".stationcool a")->attr("title");

Однако существуют конкретные случаи использования, в которых они могут помочь.

  • Многие интерфейсы обхода DOM не раскрывают HTML-комментарии <!--, которые, однако, иногда являются более полезными якорями для извлечения. В частности, псевдо-HTML-вариации <$var> или остатки SGML легко укротить с помощью регулярных выражений.
  • Часто регулярные выражения могут сэкономить на последующей обработке. Однако HTML-объекты часто требуют ручного ухода.
  • И, наконец, для e чрезвычайно простых задач , таких как извлечение

Иногда даже рекомендуется предварительно извлечь фрагмент HTML с помощью регулярных выражений /<!--CONTENT-->(.+?)<!--END-->/ и обработать оставшуюся часть с помощью более простого синтаксического анализатора HTML интерфейсы.

Примечание: На самом деле у меня есть это приложение, где я использую синтаксический анализ XML и регулярные выражения в качестве альтернативы. Только на прошлой неделе синтаксический анализ PyQuery прервался, и регулярное выражение все еще работало. Да, странно, и я сам не могу этого объяснить. Но так оно и случилось.
Поэтому, пожалуйста, не отвергайте соображения реального мира только потому, что это не соответствует мему regex= зло. Но давайте также не будем слишком сильно голосовать за это. Это просто дополнительная заметка к этой теме.

 139
Author: mario, 2016-05-07 10:43:47

PhpQuery и Путь запроса чрезвычайно похожи в репликации API fluent jQuery. Именно поэтому они являются двумя из самых простых подходов к правильному анализу HTML в PHP.

Примеры для пути запроса

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

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

Результирующий объект содержит полное древовидное представление 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]");  // get first paragraph in a div

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

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

.

PhpQuery или путь к запросу?

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

Для получения дополнительной информации о различиях см. это сравнение на машине обратного пути из tagbyte.org . (Исходный источник пропал, так что вот ссылка на интернет-архив. Да, вы все еще можете найти недостающие страницы, люди.)

И вот подробное введение в путь запроса.

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

  • Простота и надежность
  • Простые в использовании альтернативы ->find("a img, a object, div a")
  • Правильное удаление данных (по сравнению с захватом регулярных выражений)
 127
Author: mario, 2012-11-23 04:57:04

Простой HTML DOM - отличный анализатор с открытым исходным кодом:

Простой мир.источник

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

Я использовал это в ряде инструментов, тестируя его на многих различных типах веб-страниц, и я думаю, это отлично работает.

 85
Author: Robert Elwell, 2015-10-28 17:39:31

Один общий подход, о котором я здесь не упоминал, заключается в том, чтобы запускать HTML через Tidy, который можно настроить так, чтобы он выдавал гарантированно допустимый XHTML. Затем вы можете использовать на нем любую старую библиотеку XML.

Но для вашей конкретной проблемы вам следует взглянуть на этот проект: http://fivefilters.org/content-only / -- это модифицированная версия алгоритма удобочитаемости, который предназначен для извлечения только текстового содержимого (не верхних и нижних колонтитулов) со страницы.

 58
Author: Eli, 2011-05-01 02:04:38

Для 1a и 2: Я бы проголосовал за новый класс компонентов Symfony DomCrawler (DomCrawler ). Этот класс позволяет выполнять запросы, аналогичные CSS-селекторам. Взгляните на эту презентацию для реальных примеров: новости из мира symfony2.

Компонент предназначен для автономной работы и может использоваться без Symfony.

Единственным недостатком является то, что он будет работать только с PHP 5.3 или новее.

 54
Author: Timo, 2013-06-14 10:33:52

Кстати, это обычно называют очисткой экрана . Библиотека, которую я использовал для этого, - это Простой синтаксический анализатор HTML Dom.

 51
Author: Joel Verhagen, 2010-08-26 17:20:17

Ранее мы создали довольно много сканеров для наших нужд. В конце концов, обычно лучше всего работают простые регулярные выражения. Хотя библиотеки, перечисленные выше, хороши по той причине, по которой они созданы, если вы знаете, что ищете, регулярные выражения - более безопасный способ, так как вы можете обрабатывать также недопустимый HTML/ Структуры XHTML, которые потерпели бы неудачу, если бы были загружены через большинство анализаторов.

 40
Author: jancha, 2014-03-31 22:48:43

Я рекомендую PHP Простой синтаксический анализатор HTML DOM.

У него действительно есть приятные функции, такие как:

foreach($html->find('img') as $element)
       echo $element->src . '<br>';
 37
Author: Greg, 2015-10-28 17:42:57

Это звучит как хорошее описание задачи технологии W3CXPath. Легко выражать запросы типа "возвращайте все атрибуты href в тегах img, вложенные в теги <foo><bar><baz> elements". Не будучи любителем PHP, я не могу сказать вам, в какой форме может быть доступен XPath. Если вы можете вызвать внешнюю программу для обработки HTML-файла, вы должны иметь возможность использовать версию XPath для командной строки. Краткое введение см. в разделе http://en.wikipedia.org/wiki/XPath.

 35
Author: Jens, 2011-04-14 19:08:11

Сторонние альтернативы SimpleHtmlDom, которые используют DOM вместо синтаксического анализа строк: phpQuery, Зенд_дом, Путь запроса и Свободное владение.

 28
Author: Amal Murali, 2013-12-26 18:31:35

Да, вы можете использовать simple_html_dom для этой цели. Однако я довольно много работал с simple_html_dom, особенно для веб-слома, и обнаружил, что он слишком уязвим. Он выполняет основную работу, но я все равно не буду его рекомендовать.

Я никогда не использовал curl для этой цели, но я узнал, что curl может выполнять эту работу гораздо эффективнее и намного надежнее.

Пожалуйста, ознакомьтесь с этой ссылкой: очистка-веб-сайтов-с-завитком

 22
Author: Rafay, 2013-06-14 10:40:04

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

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

Для того, чтобы получить поведение, подобное jquery, вам нужно выполнить ветвление, прежде чем выполнять операцию фильтрации/модификации, это означает, что она будет гораздо точнее отражать то, что происходит в jquery.

$results = qp("div p");
$forename = $results->find("input[name='forename']");

$results теперь содержит результирующий набор для input[name='forename'], А НЕ для исходного запроса "div p". это сильно сбило меня с толку, я обнаружил, что Путь запроса отслеживает фильтры и находит и все, что изменяет ваши результаты и сохраняет их в объекте. тебе нужно это сделать вместо этого

$forename = $results->branch()->find("input[name='forname']")

Тогда $results не будет изменено, и вы сможете повторно использовать результирующий набор снова и снова, возможно, кто-то с гораздо большими знаниями сможет немного прояснить это, но в основном это похоже на то, что я нашел.

 22
Author: Christopher Thomas, 2015-01-31 10:14:42

Расширенный Html Dom - это простая замена HTMLDOM, которая предлагает тот же интерфейс, но на основе DOM, что означает, что ни одна из связанных проблем с памятью не возникает.

Он также имеет полную поддержку CSS, включая расширения jQuery.

 18
Author: pguardiario, 2015-12-28 16:48:57

Я создал библиотеку с именем Phppowertools/DOM-Запрос, что позволяет вам сканировать документы HTML5 и XML точно так же, как вы это делаете с jQuery.

Под капотом он использует symfony/Домкраулер для преобразования селекторов CSS в селекторы XPath. Он всегда использует один и тот же DOMDocument, даже при передаче одного объекта другому, чтобы обеспечить достойную производительность.


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

namespace PowerTools;

// Get file content
$htmlcode = file_get_contents('https://github.com');

// Define your DOMCrawler based on file string
$H = new DOM_Query($htmlcode);

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query($H->select('body'));

// Passing a string (CSS selector)
$s = $H->select('div.foo');

// Passing an element object (DOM Element)
$s = $H->select($documentBody);

// Passing a DOM Query object
$s = $H->select( $H->select('p + p'));

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

[...]

Поддерживаемые методы :


  1. Переименован в "выбрать" по очевидным причинам
  2. Переименован в "void", так как "пустой" - это зарезервированное слово в PHP

ПРИМЕЧАНИЕ:

Библиотека также включает в себя собственный загрузчик нулевой конфигурации для библиотек, совместимых с PSR-0. Приведенный пример должен работать "из коробки" без какой-либо дополнительной настройки. В качестве альтернативы вы можете использовать его с composer.

 17
Author: John Slegers, 2016-02-21 16:05:36

Я написал XML-анализатор общего назначения, который может легко обрабатывать файлы GB. Он основан на XmlReader и очень прост в использовании:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

Вот репозиторий github: Xmlextractor

 16
Author: Paul Warelis, 2013-05-12 01:23:11

Для HTML5 библиотека html5 была заброшена в течение многих лет. Единственная библиотека HTML5, которую я могу найти с недавними обновлениями и записями об обслуживании, - это html5-php, которая была переведена в бета-версию 1.0 чуть больше недели назад.

 16
Author: Reid Johnson, 2015-10-28 17:43:39

Вы можете попробовать использовать что-то вроде HTML Tidy для очистки любого "сломанного" HTML и преобразования HTML в XHTML, который затем можно проанализировать с помощью синтаксического анализатора XML.

 14
Author: CesarB, 2008-11-15 22:24:15

Другой вариант, который вы можете попробовать, - это Путь запроса. Он вдохновлен jQuery, но на сервере в PHP и используется в Drupal.

 13
Author: Richard Le Poidevin, 2014-03-31 22:47:49

XML_HTMLSax довольно стабилен - даже если он больше не поддерживается. Другой вариант может заключаться в том, чтобы передать вам HTML через Html Tidy, а затем проанализировать его с помощью стандартных инструментов XML.

 11
Author: troelskn, 2008-11-15 19:55:44

Фреймворк Symfony имеет пакеты, которые могут анализировать HTML, и вы можете использовать стиль CSS для выбора доменов вместо использования XPath.

 11
Author: Tuong Le, 2014-03-31 22:49:29

Существует множество способов обработки HTML/XML DOM, большинство из которых уже упоминалось. Следовательно, я не буду делать никаких попыток перечислить их сам.

Я просто хочу добавить, что лично я предпочитаю использовать расширение DOM и почему:

  • iit оптимально использует преимущества производительности базового кода C
  • это OO PHP (и позволяет мне подклассировать его)
  • это довольно низкий уровень (что позволяет мне использовать его в качестве не раздутой основы для большего продвинутое поведение)
  • он обеспечивает доступ ко всем частям DOM (в отличие, например, от SimpleXML, который игнорирует некоторые менее известные функции XML)
  • он имеет синтаксис, используемый для обхода DOM, который аналогичен синтаксису, используемому в собственном Javascript.

И хотя мне не хватает возможности использовать селекторы CSS для DOMDocument, есть довольно простой и удобный способ добавить эту функцию: создание подкласса DOMDocument и добавление JS-подобных querySelectorAll и querySelector методов в ваш подкласс.

Для анализируя селекторы, я рекомендую использовать очень минималистичный компонент cssSelector из фреймворка Symfony. Этот компонент просто преобразует селекторы CSS в селекторы XPath, которые затем могут быть введены в DOMXpath для получения соответствующего списка узлов.

Затем вы можете использовать этот (все еще очень низкоуровневый) подкласс в качестве основы для более высокоуровневых классов, предназначенных, например. проанализируйте очень специфические типы XML или добавьте больше поведения, подобного jQuery.

Приведенный ниже код приходит прямо из моей библиотеки DOM-запросов и использует метод, который я описал.

Для синтаксического анализа HTML:

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '<!DOCTYPE ') === 0 || strpos($data_start, '<html>') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('<!DOCTYPE html><html><head><meta charset="' . $encoding . '" /></head><body></body></html>');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

Смотрите также Анализ XML-документов с помощью CSS-селекторов создателем Symfony Фабьеном Потенсье о его решении создать компонент cssSelector для Symfony и о том, как его использовать.

 10
Author: John Slegers, 2016-01-15 16:02:29

С Жидкокристаллический вы можете запрашивать и повторять XML с помощью XPath и селекторов CSS.

$doc = fluidxml('<html>...</html>');

$title = $doc->query('//head/title')[0]->nodeValue;

$doc->query('//body/p', 'div.active', '#bgId')
        ->each(function($i, $node) {
            // $node is a DOMNode.
            $tag   = $node->nodeName;
            $text  = $node->nodeValue;
            $class = $node->getAttribute('class');
        });

Https://github.com/servo-php/fluidxml

 9
Author: Daniele Orlando, 2016-03-07 16:44:44

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

Выше это функция, которая анализирует HTML с помощью регулярного выражения. Обратите внимание, что эта функция очень чувствительна и требует, чтобы HTML подчинялся определенным правилам, но она очень хорошо работает во многих сценариях. Если вам нужен простой синтаксический анализатор и вы не хотите устанавливать библиотеки, попробуйте сделать это:

function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));

    return $result;
}

function extract_data($str) {
    return (is_array($str))
        ? array_map('extract_data', $str)
        : ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</\1>#s', $str, $matches))
            ? $str
            : array_map(('extract_data'), array_combine_($matches[1], $matches[2])));
}

print_r(extract_data(file_get_contents("http://www.google.com/")));
 7
Author: Daniel Loureiro, 2015-10-28 17:45:41

JSON и массив из XML в трех строках:

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

Та да!

 6
Author: Antonio Max, 2015-10-28 17:44:03

Я создал библиотеку под названием HTML5DOMDocument, которая находится в свободном доступе по адресу https://github.com/ivopetkov/html5-dom-document-php

Он также поддерживает селекторы запросов, что, я думаю, будет чрезвычайно полезно в вашем случае. Вот пример кода:

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello</h1><div class="content">This is some text</div></body></html>');
echo $dom->querySelector('h1')->innerHTML;
 2
Author: Ivo Petkov, 2017-12-21 08:38:33

Если вы знакомы с селектором jQuery, вы можете использовать scarletsquery для PHP

<pre><?php
include "ScarletsQuery.php";

// Load the HTML content and parse it
$html = file_get_contents('https://www.lipsum.com');
$dom = Scarlets\Library\MarkupLanguage::parseText($html);

// Select meta tag on the HTML header
$description = $dom->selector('head meta[name="description"]')[0];

// Get 'content' attribute value from meta tag
print_r($description->attr('content'));

$description = $dom->selector('#Content p');

// Get element array
print_r($description->view);

Этой библиотеке обычно требуется менее 1 секунды для обработки автономного html.
Он также принимает недопустимый HTML-код или отсутствующую цитату в атрибутах тегов.

 0
Author: StefansArya, 2018-08-16 12:35:01