<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>Xpath vs regexp.</title><html>&lt;p&gt;Стояла задача - собрать некую их статичных html-файлов,в основном табличные данные и ещё немного всего по вершкам. Вёрстка не ахти, поэтому встал вопрос о том что некоторые страницы придётся &quot;парсить вручную&quot;… Закономерности есть, но слишком много условностей (где-то есть class,где-то id, где-то в table есть tbody и т.п.) …&lt;br /&gt;&lt;/p&gt;Казалось бы ничего сложного - регулярные выражения вроде бы просто созданы для этого... но мне как-то неулыбалось их составлять… И тут я вспомнил что совсем недавно, исследуя &lt;a href=&quot;http://mozdev.org&quot;&gt;mozdev.org&lt;/a&gt; наткнулся на плагин к firefox-у, который зовётся &lt;a href=&quot;http://xpath.alephzarro.com/&quot;&gt;Xpather&lt;/a&gt;.Он помимо основной своей функции (показывать нужные ноды по пути и путь выбранной ноды), имеет кратенькую справку, которая открыла глаза на лёгкость написания &quot;непонятных заборов и закорючек&quot;.&lt;br /&gt;&lt;br /&gt;&nbsp; &quot;Отлично&quot; - подумал я - &quot;так тому и быть…&quot;. Осталось преобразовать имеющуюся в наличии совсем невалидную html-ку в xml. &lt;a href=&quot;http://php.net/tidy&quot;&gt;Tidy&lt;/a&gt; мне помочь отказался (или, что вернее,я не умею его готовить) , &lt;a href=&quot;http://php.net/manual/en/function.tidy-clean-repair.php&quot;&gt;tidy_clean_repair&lt;/a&gt; предлагал мне &quot;исправить&quot; разметку и т.д. и т.п. Тут же вспомнился замечательный класс &lt;a href=&quot;http://pixel-apes.com/safehtml/&quot;&gt;SafeHTML&lt;/a&gt; ( он так же проживает в &lt;a href=&quot;http://pear.php.net/package/html_safe/&quot;&gt;PEAR::HTML_Safe&lt;/a&gt; ), который помог расчистить разнообразный хлам и выдал мне xhtml. Ну а далее &lt;a href=&quot;http://php.net/manual/en/function.dom-domdocument-loadhtml.php&quot;&gt;DOMDocument::loadHTML&lt;/a&gt;. Но ёлки-палки… ругается на nobr ещё на что-то… но дерево выдаёт. Поставить &lt;a href=&quot;http://php.net/manual/en/language.operators.errorcontrol.php&quot;&gt;соб@ку&lt;/a&gt; ? &lt;a href=&quot;http://miracle.rpz.name/2006/02/24/&quot;&gt;ну уж нет&lt;/a&gt;… SafeHTML имеет в свойствах массив $deleteTags, туда и добавил nobr и ещё парочку совсем ненужных мне тегов (img например). И так у меня есть dom-дерево, у меня есть функция &lt;a href=&quot;http://php.net/simplexml_import_dom&quot;&gt;simplexml_import_dom&lt;/a&gt; и есть чёткая уверенность в том что в третьей таблице, во всех рядах начиная с третьего, во второй ячейке есть необходимые мне данные, но они являются необходимыми если среди текста этой ячейки есть ключевое слово (пусть это будет &quot;keyword&quot;). Я конечно &quot;не боюсь&quot; регулярных выражений, но не настолько хорошо их знаю чтобы написать нужное мне. А вот xpath тут как нельзя кстати :&lt;br /&gt;&lt;blockquote&gt; $xpath = &quot;//table[position() = 3]//tr[position() &gt;=3]//td[position() = 2 and contains(text(),&quot;keyword&quot;)]/text()&quot;;&lt;/blockquote&gt;&lt;br /&gt;&nbsp; После выполнения $simplexml-&gt;xpath($xpath); я получаю массив, который содержит текст из искомых ячеек.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&nbsp; Итого: избавил товарищей от долгой и нудной,ручной подготовки данных, ещё раз убедился что xpath это &lt;strike&gt;вам не пряники на кладбище тырить&lt;/strike&gt; не только страшная абревиатура, но полезная штука…&lt;/p&gt;&lt;p&gt;P.S. &lt;br /&gt;&nbsp;Я ни в коем случае не предлагаю повсеместно применять подобную технику (построение dom-дерева операция очень &quot;памятеёмкая&quot;, xpath &lt;strike&gt;вероятнее всего&lt;/strike&gt; тоже), но в ряде случаев использовать такой метод проще и понятнее иных методов…&lt;/p&gt;&lt;p&gt;И название поста &quot;дурацкое&quot;, но на другое не хватает буйности фантазии...&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/dev&quot; rel=&quot;tag&quot;&gt;dev&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/php&quot; rel=&quot;tag&quot;&gt;php&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/xpath&quot; rel=&quot;tag&quot;&gt;xpath&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/simplexml&quot; rel=&quot;tag&quot;&gt;simplexml&lt;/a&gt;</html><type>rich</type></oembed>