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


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


1872


источник


Ответы:


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

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

DOM

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

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

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

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

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

XMLReader

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

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

Пример основного использования можно найти в получение всех значений из тегов h1 с использованием php

XML Parser

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

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

SimpleXml

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

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

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


Библиотеки третьих сторон (основанные на libxml)

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

FluentDom

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.

phpQuery (не обновляется в течение многих лет)

phpQuery - это серверный, цепной, управляемый CSS3 API-интерфейс Document Object Model (DOM), основанный на jQuery JavaScript Library, написанный на PHP5, и предоставляет дополнительный интерфейс командной строки (CLI).

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

Zend_Dom

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

QueryPath

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

fDOMDocument

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

сабля / XML

saber / xml - это библиотека, которая обертывает и расширяет классы XMLReader и XMLWriter для создания простой системы сопоставления «xml to object / array» и шаблона проектирования. Запись и чтение XML однопроходная, поэтому она может быть быстрой и требует небольшой памяти больших файлов xml.

FluidXML

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


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

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

PHP простой 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. Эти проблемы, в частности, связаны с вложенными циклами. Сама документация неточна и ошибочна, без ответов на исправления с 14 апреля 16.

Ganon

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

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


HTML 5

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

html5lib

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

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


WebServices

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

YQL

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

ScraperWiki ,

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


Обычные выражения

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

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

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

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

Также см Parsing Html Путь Cthulhu


книги

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

Я не являюсь аффилированным лицом с PHP Architect или авторами.


1699



Пытаться Простой HTML DOM Parser

  • Парсер 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;


Скребок Slashdot:

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

300



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


220



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

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

Подумайте, что создание несколько надежного HTML-выражения regex:

<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 очень простые задачи как извлечение <img src = urls, они на самом деле являются вероятным инструментом. Преимущество в скорости по сравнению с синтаксическими анализаторами SGML / XML в основном просто необходимо для этих основных процедур извлечения.

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

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


133



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

Примеры для QueryPath

В основном вы сначала создаете запрашиваемое дерево 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

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 (из-за меньшего количества общих функций).

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

И вот всеобъемлющее введение QueryPath ,

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

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

125



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

simplehtmldom.sourceforge

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

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


83



One general approach I haven't seen mentioned here is to run HTML through Tidy, which can be set to spit out guaranteed-valid XHTML. Then you can use any old XML library on it.

But to your specific problem, you should take a look at this project: http://fivefilters.org/content-only/ -- it's a modified version of the Readability algorithm, which is designed to extract just the textual content (not headers and footers) from a page.


57



For 1a and 2: I would vote for the new Symfony Componet class DOMCrawler ( DomCrawler ). This class allows queries similar to CSS Selectors. Take a look at this presentation for real-world examples: news-of-the-symfony2-world.

The component is designed to work standalone and can be used without Symfony.

The only drawback is that it will only work with PHP 5.3 or newer.


53



This is commonly referred to as screen scraping, by the way. The library I have used for this is Simple HTML Dom Parser.


50