Как вы анализируете и обрабатываете HTML / XML в PHP? - PullRequest
2034 голосов
/ 26 августа 2010

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

Ответы [ 30 ]

1837 голосов
/ 26 августа 2010

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

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

DOM

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

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

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

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

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

XMLReader

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

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

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

XML Parser

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

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

SimpleXml

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

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

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


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

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

FluentDom - Репо

FluentDOM предоставляет jQuery-подобный свободный XML-интерфейс для 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 - это 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

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

FluidXML

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


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

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

PHP Simple HTML DOM Parser

  • HTML DOM Parser, написанный на 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 апреля.

Ganon

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

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


HTML 5

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

html5lib

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

Мы можем увидеть больше выделенных парсеров после завершения HTML5.Также есть блог от W3 под названием How-To для разбора html 5 , который стоит проверить.


WebServices

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

ScraperWiki .

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


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

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

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

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

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

Также см. Синтаксический анализ HTML The Cthulhu Way


Книги

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

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

318 голосов
/ 26 августа 2010

Попробуйте Простой 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);
231 голосов
/ 26 ноября 2008

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

144 голосов
/ 06 сентября 2010

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

Во-первых, распространенный неправильный термин: регулярные выражения не для " разбор" 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 чрезвычайно простых задач , таких как извлечение
129 голосов
/ 07 сентября 2010

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")
  • Правильное удаление данных (по сравнению с регулярным выражением)
88 голосов
/ 16 ноября 2008

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

simplehtmldom.sourceforge

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

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

59 голосов
/ 01 мая 2011

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

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

55 голосов
/ 06 сентября 2010

За 1a и 2: я бы проголосовал за новый класс компонента Symfony DOMCrawler ( DomCrawler ).Этот класс позволяет выполнять запросы, аналогичные селекторам CSS.Посмотрите на эту презентацию примеры из реальной жизни: news-of-the-symfony2-world .

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

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

52 голосов
/ 26 августа 2010

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

41 голосов
/ 04 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...