<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3533262157176083768</atom:id><lastBuildDate>Mon, 16 Feb 2026 14:00:39 +0000</lastBuildDate><category>Delphi</category><category>PHP</category><category>парсинг</category><category>разработка</category><category>RSSAdder</category><category>код</category><category>способы применения парсинга</category><category>TWebBrowser</category><category>парсер</category><category>регулярные выражения</category><category>узкие места</category><category>CURL</category><category>web-автоматизация</category><category>форумы</category><category>IdHTTP</category><category>Simple HTML DOM</category><category>XML</category><category>компоненты и библиотеки Delphi</category><category>IHTMLDocument2</category><category>RSS</category><category>RegExp</category><category>TTreeView</category><category>tools</category><category>БД</category><category>Synapse</category><category>TChromium</category><category>csv</category><category>Яндекс</category><category>алгоритмы</category><category>базы</category><category>блог</category><category>жизнь</category><category>объектная модель</category><category>теория</category><category>Curlpas</category><category>DISQLite</category><category>Indy</category><category>SQLite</category><category>Telegram</category><category>UrlDownloadToFile</category><category>XMLDocument</category><category>coHTMLDocument</category><category>linux</category><category>боты</category><category>на примерах читателей</category><category>опупеть</category><category>отладка</category><category>парсинг Google</category><category>парсинг Яндекса</category><category>парсинг выдачи поисковиков</category><title>Парсинг от А до Я</title><description>Блог о программировании парсеров и web-автоматизации</description><link>http://parsing-and-i.blogspot.com/</link><managingEditor>noreply@blogger.com (Masha)</managingEditor><generator>Blogger</generator><openSearch:totalResults>111</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-6050625187388238484</guid><pubDate>Mon, 19 Jan 2026 12:44:00 +0000</pubDate><atom:updated>2026-01-19T15:44:23.209+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Telegram</category><category domain="http://www.blogger.com/atom/ns#">боты</category><title>He Is Alive! или Блог-феникс :)</title><description>&lt;p&gt;Всем привет. С момента последней записи прошло так много лет! Но вот я вернулась. Программисты, как и блогеры, бывшими не бывают :)&lt;/p&gt;&lt;p&gt;Сейчас немного осмотрюсь здесь, вспомню, что к чему. Понимаю, что с появлением соцсетей блог-платформы вроде как изжили себя. Но вчера случайно зашла в статистику парочки своих уцелевших сайтов, которыми я не занималась больше года, и была удивлена. Трафик там был!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgLm7lxMMqIFufN6Q5KWzEm8JEpeAWxxXf4L4zSq3wKVbrnZukV0-VcJNNZBY_FzABzWDMdq9nCi6y4a0o0oTPc1ZPGTfteW6FTwub0VmqDqlU0HRas6JrME2mT-d7CuUnc0Krt76gTg5fS9jaY1iRubHP067LCxNEVH3AaYTQt8koEXHjgWE7fITI8THHv&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;220&quot; data-original-width=&quot;501&quot; height=&quot;141&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgLm7lxMMqIFufN6Q5KWzEm8JEpeAWxxXf4L4zSq3wKVbrnZukV0-VcJNNZBY_FzABzWDMdq9nCi6y4a0o0oTPc1ZPGTfteW6FTwub0VmqDqlU0HRas6JrME2mT-d7CuUnc0Krt76gTg5fS9jaY1iRubHP067LCxNEVH3AaYTQt8koEXHjgWE7fITI8THHv&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Вот и подумала, может, и этот блог принесет какой-никакой траффик? Шальной, залетный...&lt;/p&gt;&lt;p&gt;Ну и расскажу о себе немного.&lt;/p&gt;&lt;p&gt;Я Маша. Раньше я специализировалась на парсинге, а сейчас - на автоматизации в Telegram. Пишу ботов для себя и на заказ. Могу кодить, могу собрать бюджетненько на ноу-код платформе.&lt;/p&gt;&lt;p&gt;Люблю, чтобы все было по полочкам. Много идей (а с ними - и пет-проектов).&lt;/p&gt;&lt;p&gt;Сейчас обитаю в основном в Telegram. Вот мой канал про ботов - &lt;a href=&quot;https://t.me/bots_at_work&quot; target=&quot;_blank&quot;&gt;Боты на работе&lt;/a&gt; @bots_at_work&lt;/p&gt;&lt;p&gt;Создала и продвигаю &lt;a href=&quot;https://t.me/take_a_card_bot&quot;&gt;бота Держи карту&lt;/a&gt; - он выдает карту или текстовую подсказку по ключевому слову в комментариях канала/группах. Подходит для проведения интерактивов. Бесплатно 2 слота под колоды, 2 слота под тексты.&lt;/p&gt;</description><link>http://parsing-and-i.blogspot.com/2026/01/he-is-alive.html</link><author>noreply@blogger.com (Мария)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgLm7lxMMqIFufN6Q5KWzEm8JEpeAWxxXf4L4zSq3wKVbrnZukV0-VcJNNZBY_FzABzWDMdq9nCi6y4a0o0oTPc1ZPGTfteW6FTwub0VmqDqlU0HRas6JrME2mT-d7CuUnc0Krt76gTg5fS9jaY1iRubHP067LCxNEVH3AaYTQt8koEXHjgWE7fITI8THHv=s72-c" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-7006352777156333890</guid><pubDate>Sun, 07 Jul 2013 21:24:00 +0000</pubDate><atom:updated>2013-07-08T01:25:00.658+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">DISQLite</category><category domain="http://www.blogger.com/atom/ns#">SQLite</category><title>Как отобразить данные SQLite в DBGrid</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
TSQLMonitor поддерживает SQLite, начиная с версии RAD Studio XE3 (использовать его, естественно, вместе с TSQLConnection). У меня Delphi старенькие, поэтому покажу, как старыми дедовскими методами отобразить выборку данных в DBGrid (с помощью обертки DISQLite, о которой я писала &lt;a href=&quot;http://parsing-and-i.blogspot.ru/2013/01/sqlite-delphi-7-disqlite.html&quot;&gt;тут&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Пример работает как в Delphi 7, так и в Delphi 2010. В других версиях просто не пробовала.&lt;br /&gt;
&lt;br /&gt;
Следуя шаг за шагом инструкции, приведенной ниже, вы добьетесь желаемого результата — отобразите данные из запроса к БД &lt;i&gt;SQLite&lt;/i&gt; в стандартной таблице &lt;i&gt;DBGrid&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinS0zvNSvXyLoC3y6e8posVGGBxKydBpgJ5rQSCQve__4MF5eXjct_iwsWy8M24DjyIJCrovWXXT_S9ZIA0XWKHk1gUjF1EU0br3kxdlvStWs-2r4ZYNVmqQs_WcfA-2U5epn9ahqOlTQ/s1600/dbgrid-DISQLite.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinS0zvNSvXyLoC3y6e8posVGGBxKydBpgJ5rQSCQve__4MF5eXjct_iwsWy8M24DjyIJCrovWXXT_S9ZIA0XWKHk1gUjF1EU0br3kxdlvStWs-2r4ZYNVmqQs_WcfA-2U5epn9ahqOlTQ/s1600/dbgrid-DISQLite.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
1. Разместите на форме:&lt;br /&gt;
- DBGrid&lt;br /&gt;
- ClientDataSet&lt;br /&gt;
- DataSetProvider&lt;br /&gt;
- DataSource&lt;br /&gt;
Если используете визуальные компоненты, то: &lt;i&gt;DISQLite3Database&lt;/i&gt; и &lt;i&gt;DISQLite3UniDirQuery&lt;/i&gt;. Если визуальными компонентами от DISQLite не пользуетесь, то экземпляры этих классов создадите динамически.&lt;br /&gt;
&lt;br /&gt;
2. У DISQLite3UniDirQuery в поле &lt;i&gt;Database := DISQLite3Database&lt;/i&gt;. И заполните SelectSQL.&lt;br /&gt;
&lt;br /&gt;
3. У DataSetProvider: &lt;i&gt;DataSet := DISQLite3UniDirQuer&lt;/i&gt;y.&lt;br /&gt;
&lt;br /&gt;
4. У ClientDataSet: &lt;i&gt;ProviderName := DataSetProvider&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
5. У DataSource: &lt;i&gt;DataSet := ClientDataSet&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
6. У DBGrid: &lt;i&gt;DataSource := DataSource&lt;/i&gt;. Соответственно, заполните Columns, которые бы хотели видеть отображенными в таблице.&lt;br /&gt;
&lt;br /&gt;
Вот и все.&lt;br /&gt;
&lt;br /&gt;
Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://parsing-and-i.blogspot.ru/feeds/posts/default&quot; rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.&lt;/div&gt;
</description><link>http://parsing-and-i.blogspot.com/2013/07/sqlite-dbgrid-kak-otobrazit-dannie.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinS0zvNSvXyLoC3y6e8posVGGBxKydBpgJ5rQSCQve__4MF5eXjct_iwsWy8M24DjyIJCrovWXXT_S9ZIA0XWKHk1gUjF1EU0br3kxdlvStWs-2r4ZYNVmqQs_WcfA-2U5epn9ahqOlTQ/s72-c/dbgrid-DISQLite.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-4385323103431350215</guid><pubDate>Wed, 20 Feb 2013 21:02:00 +0000</pubDate><atom:updated>2013-02-21T01:02:33.602+04:00</atom:updated><title>TChromium: заполнение и сабмит формы</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvylVuoDWcQKYmOIensOCxYvpkdMo_mu-9JISQLMKzJVpEu8XQQLKY5s_Qc8iML_3MJ4-_qlGi-IaEsXNs4aok7u8JpyEfcaawXK2zHJqDcQQoCFToxzCgpL-u91cVU_mZMdMHDaJSPPU/s1600/vk-login-form.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvylVuoDWcQKYmOIensOCxYvpkdMo_mu-9JISQLMKzJVpEu8XQQLKY5s_Qc8iML_3MJ4-_qlGi-IaEsXNs4aok7u8JpyEfcaawXK2zHJqDcQQoCFToxzCgpL-u91cVU_mZMdMHDaJSPPU/s1600/vk-login-form.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Опишу самый простой способ заполнения и отправки формы с использованием компонента TChromium. С доступом к DOM-элементам по id в нем дела обстоят не так хорошо, как в Webbrowser-е, но зато очень просто исполнять любые java-скрипты.&lt;br /&gt;
&lt;br /&gt;
JavaScript может пригодится не только для заполнения форм, он вообще достаточно широко используется.&lt;br /&gt;
&lt;br /&gt;
Исполнение скрипта осуществляется с помощью &lt;i&gt;ExecuteJavaScript&lt;/i&gt;. При этом обязательно проверять, чтобы &lt;i&gt;Chromium.Browser&lt;/i&gt; и &lt;i&gt;Chromium.Browser.Mainframe&lt;/i&gt; были отличны от &lt;b&gt;nil&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Вот как будет выглядеть заполнение и сабмит формы логина на сайте vk.com.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;procedure TfrmMain.btnLoginClick(Sender: TObject);
var
  CodeStr : string;
begin
  if Assigned(Chromium.Browser) and Assigned(Chromium.Browser.Mainframe) then
    begin
      CodeStr := &#39;document.forms[0].quick_email.value=&quot;UserEmail&quot;;&#39;;
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, &#39;about:blank&#39;, 0);
      CodeStr := &#39;document.forms[0].quick_pass.value=&quot;UserPass&quot;;&#39;;
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, &#39;about:blank&#39;, 0);
      CodeStr := &#39;document.forms[0].submit();&#39;;
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, &#39;about:blank&#39;, 0);
    end;
end;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
На практике столкнулась с необъяснимой ситуацией: если этот код попробовать запустить в Delphi 7, то &lt;i&gt;Chromium.Browser.Mainframe&lt;/i&gt; почему-то будет равен nil (а если проверку убрать, то вываливается ошибка доступа). На каком-то форуме нашла, что это общая проблема для Семерки. В 2010 все работает отлично.&lt;br /&gt;
&lt;br /&gt;
Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot; rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
</description><link>http://parsing-and-i.blogspot.com/2013/02/tchromium-how-to-fill-and-submit-form.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvylVuoDWcQKYmOIensOCxYvpkdMo_mu-9JISQLMKzJVpEu8XQQLKY5s_Qc8iML_3MJ4-_qlGi-IaEsXNs4aok7u8JpyEfcaawXK2zHJqDcQQoCFToxzCgpL-u91cVU_mZMdMHDaJSPPU/s72-c/vk-login-form.png" height="72" width="72"/><thr:total>13</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-8171969770269027199</guid><pubDate>Fri, 08 Feb 2013 20:38:00 +0000</pubDate><atom:updated>2013-02-10T23:51:25.624+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">TChromium</category><title>Как удалить кукисы (cookies) в TChromium</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
В комментариях к статье &lt;a href=&quot;http://parsing-and-i.blogspot.com/2013/01/tchromium-cookies-in-delphi.html&quot;&gt;о начале работы с TChromium&lt;/a&gt; спросили, как удалить в нем кукисы? Скажу сразу, решение не мое, нашла в свое время на СтэкОверфлоу, скопировала и с тех пор удачно использую.&lt;br&gt;
&lt;br&gt;
Сначала надо отметить, что у интерфейса &lt;i&gt;ICefCookieManager&lt;/i&gt; есть метод &lt;i&gt;DeleteCookies&lt;/i&gt;, но он почему-то не работает. То есть в результате выполнения кода:

&lt;br&gt;
&lt;br&gt;
&lt;pre&gt;procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  if not CookieManager.DeleteCookies(&amp;#39;&amp;#39;, &amp;#39;&amp;#39;) then
    ShowMessage(&amp;#39;Кукисы не удалены!&amp;#39;);
end;&lt;/pre&gt;
&lt;br&gt;
заведомо появится сообщение, что удаление кукисов провалилось. Не знаю, может, это только у меня так...&lt;br&gt;
&lt;br&gt;
Решение же таково: надо обойти все хранящиеся кукисы с помощью &lt;b&gt;VisitAllCookiesProc&lt;/b&gt; и внутри visitor-а установить их свойство &lt;i&gt;deleteCookie&lt;/i&gt; равным &lt;i&gt;True (1)&lt;/i&gt;.

&lt;br&gt;
&lt;br&gt;
&lt;pre&gt;procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  CookieManager.VisitAllCookiesProc(
    function(const name, value, domain, path: ustring; secure, httponly,
      hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
      count, total: Integer; out deleteCookie: Boolean): Boolean
    begin
      deleteCookie := True;
      ShowMessage(&amp;#39;Кукисы для домена &amp;#39; + domain + &amp;#39; удалены!&amp;#39;);
    end
  );
end;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2013/02/how-to-clear-cookies-in-TChromium.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2013/02/how-to-clear-cookies-in-TChromium.html</link><author>noreply@blogger.com (Masha)</author><thr:total>11</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-1654901424720752362</guid><pubDate>Sat, 26 Jan 2013 16:02:00 +0000</pubDate><atom:updated>2013-02-10T08:37:51.934+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">БД</category><category domain="http://www.blogger.com/atom/ns#">компоненты и библиотеки Delphi</category><title>SQLite и Delphi 7: работа с БД с помощью DISQLite</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Для тех, кто случайно наткнулся на эту статью. Я хочу провести эксперимент с продвижением в социальной сети VK.com, используя автоматизацию. Для этого я пишу (пусть и очень медленно, в свободное время) свое приложение и частично освещаю ход работ на этом блоге.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
В предыдущей серии я рассказала про &lt;a href=&quot;http://parsing-and-i.blogspot.com/2013/01/tchromium-cookies-in-delphi.html&quot; target=&quot;_blank&quot;&gt;компонент для браузера&lt;/a&gt;, который буду использовать. Настало время определиться с данными.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Сначала хотела вообще обойтись без БД, а заодним и описать работу с XML, но, подумав, решила, что без базы будет сложно (и неудобно, если пользователей заведется много). Особенно, если разрабатывать с перспективами. Поэтому сегодня речь пойдет о &lt;b&gt;SQLite&lt;/b&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Чем руководствовалась при выборе БД?&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Максимальная простота и легкость.&lt;/li&gt;
&lt;li&gt;Минимум телодвижений для работы приложения на другой машине: надо просто скопировать все содержимое папки к себе (кроме файлов БД нужна только dll).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;/h3&gt;&lt;/div&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2013/01/sqlite-delphi-7-disqlite.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2013/01/sqlite-delphi-7-disqlite.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix8jbXpUXrW5Er0tawQ-mynHE5-Fw3jvxZFBkb8ZGXg6SSum3A_aDlFXc4sshUzjMLU6Jqa5cSOim5tV5hyrrh-8pzuefPui5FUHAHlSLjJunSp09mJ63GjEJ_oUaMLVjeTU4OkjxDcQI/s72-c/DISQLite-components.png" height="72" width="72"/><thr:total>9</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-928120080386009978</guid><pubDate>Mon, 14 Jan 2013 18:33:00 +0000</pubDate><atom:updated>2013-01-14T22:46:02.894+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">TChromium</category><category domain="http://www.blogger.com/atom/ns#">компоненты и библиотеки Delphi</category><title>Компонент TChromium: начало работы, установка</title><description>Сегодня речь пойдет о компоненте &lt;b&gt;TChromium (dcef3)&lt;/b&gt;. Что это за компонент и в чем его преимущества перед стандартным TWebbrowser?&lt;br /&gt;
&lt;br /&gt;
Я могу назвать 2 главных преимущества, например, в привязке к разработке утилиты для Вконтакта. Во-первых, он пошустрее будет. Во-вторых, в нем очень удобная и простая работа с cookies.&lt;br /&gt;
&lt;br /&gt;
Поясню второй пункт. Например, нам надо, чтобы через одну форму можно было работать с несколькими аккаунтами vk.com без постоянного &quot;перелогинивания&quot;. В Webbrowser-е это можно организовать только шаманскими методами, а вот в Chromium-e решение выглядит очень красиво и просто.&lt;br /&gt;
&lt;h3&gt;
Установка DCEF3 в Delphi7 (компонент TChromium)&lt;/h3&gt;
&lt;div&gt;
На Googlecode можно найти 2 версии: старую (&lt;a href=&quot;http://code.google.com/p/delphichromiumembedded/&quot;&gt;http://code.google.com/p/delphichromiumembedded/&lt;/a&gt;) и поновее (&lt;a href=&quot;http://code.google.com/p/dcef3/&quot;&gt;http://code.google.com/p/dcef3/&lt;/a&gt;). Рекомендую вторую.&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Скачиваем свежий дистрибутив с помощью SVN в папку &lt;i&gt;c:\Program Files\Borland\Delphi7\Lib\dcef3&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Загружаем Delphi, выбираем через &quot;Open&quot; пакет для D7, компилируем и инсталлируем. Если все хорошо, покажут TChromium в списке доступных компонентов на отдельной новой вкладке.&lt;/li&gt;
&lt;li&gt;Закрываем пакет, не сохраняя изменения в проекте.&lt;/li&gt;
&lt;li&gt;Проверяем Chromium в работе.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h3&gt;
Тестирование работы компонента&lt;/h3&gt;
&lt;div&gt;
Для теста создадим на форме 2 браузера, которые будут работать с независимыми друг от друга кукисами. С компонентом TWebbrowser такого так просто не добиться.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Размещаем на форме компонент TChromium и 2 кнопки.&lt;/div&gt;
&lt;br /&gt;
В папку с проектом (или туда, куда компиллируется программа) копируем dll-ки из &lt;i&gt;c:\Program Files\Borland\Delphi7\Lib\dcef3\bin\Win32\&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
В &lt;i&gt;uses&lt;/i&gt; дописываем библиотеку &lt;i&gt;&lt;b&gt;ceflib&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
В обработчиках нажатия кнопок пишем:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;const
  DefaultCookiesDir = &#39;Cookies/&#39;;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
  CookiesPath  : String;
begin
  CookiesPath := ExtractFilePath(Application.ExeName) + DefaultCookiesDir + &#39;User1&#39;;
  CookieManager := TCefCookieManagerRef.Global;
  CookieManager.SetStoragePath(CookiesPath);
  Chromium1.Load(&#39;vk.com&#39;);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
  CookiesPath  : String;
begin
  CookiesPath := ExtractFilePath(Application.ExeName) + DefaultCookiesDir + &#39;User2&#39;;
  CookieManager := TCefCookieManagerRef.Global;
  CookieManager.SetStoragePath(CookiesPath);
  Chromium1.Load(&#39;vk.com&#39;);
end;
&lt;/pre&gt;
&lt;br /&gt;
Не ждите, что это уже получилось супер-приложение :) Я просто привожу пример, как для TChromium можно с легкостью переключать папки, в которых браузер хранит кукисы.&lt;br /&gt;
&lt;br /&gt;
Нажимаем на первую кнопку, логинимся:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJbhpuuVFaNEEIuNn7Ksg_eqw7WnKxSCtGE1V314B5-4PDPRTY1ZxPTGazLhngaAF6TWnLdyLyqqWDd8TBXQ6CekQYegH7WYe3eCXNJSGG-sc1fXAPoR48WQfS04iIJWt1kQHznG-QWuY/s1600/user1-chromium.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJbhpuuVFaNEEIuNn7Ksg_eqw7WnKxSCtGE1V314B5-4PDPRTY1ZxPTGazLhngaAF6TWnLdyLyqqWDd8TBXQ6CekQYegH7WYe3eCXNJSGG-sc1fXAPoR48WQfS04iIJWt1kQHznG-QWuY/s1600/user1-chromium.png&quot; height=&quot;171&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Нажимаем на вторую кнопку. Второй раз браузер будет использовать совсем другие кукисы, поэтому загружается главная страница.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqZVXig0qfJqVRGymq_ffroAYYbubYn9QShpsfxqeEYlWEzcOpemtjI8JDwsZVy8FVP4VZK4NWXRlWJSsvQTnLKnEdQFuXrIrRnaiLzBK7lRYuORbJFu4I3-l_WaoluG57L66tjEk2L28/s1600/user2-chromium.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqZVXig0qfJqVRGymq_ffroAYYbubYn9QShpsfxqeEYlWEzcOpemtjI8JDwsZVy8FVP4VZK4NWXRlWJSsvQTnLKnEdQFuXrIrRnaiLzBK7lRYuORbJFu4I3-l_WaoluG57L66tjEk2L28/s1600/user2-chromium.png&quot; height=&quot;171&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
При этом автоматически создаются подкаталоги в папке &lt;i&gt;Cookies&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSlhKa4eGftjYI-Gw3a-jHGEopZIWQWl0js_02RGWctS14WR_2Hi6KK4O3J75Xm3TfQmHwzBrrA4Cc2xqmbPauFjUCFtlR5IrQGON2j7f-D_bGo4myIF1G7wofqwWYLQQGENQ-w8i69tM/s1600/cookies-path.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSlhKa4eGftjYI-Gw3a-jHGEopZIWQWl0js_02RGWctS14WR_2Hi6KK4O3J75Xm3TfQmHwzBrrA4Cc2xqmbPauFjUCFtlR5IrQGON2j7f-D_bGo4myIF1G7wofqwWYLQQGENQ-w8i69tM/s1600/cookies-path.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Если после этого снова нажать на первую кнопку, то загрузится страница пользователя, под которым логинились вначале.&lt;br /&gt;
&lt;br /&gt;
Тут видно еще один плюс для приложения, работающего с множеством юзеров. Кукисы сохраняются, поэтому в течение их срока жизни каждый раз логиниться не надо — достаточно просто проверять, что залогинены.&lt;br /&gt;
&lt;br /&gt;
Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot; rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.
</description><link>http://parsing-and-i.blogspot.com/2013/01/tchromium-cookies-in-delphi.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJbhpuuVFaNEEIuNn7Ksg_eqw7WnKxSCtGE1V314B5-4PDPRTY1ZxPTGazLhngaAF6TWnLdyLyqqWDd8TBXQ6CekQYegH7WYe3eCXNJSGG-sc1fXAPoR48WQfS04iIJWt1kQHznG-QWuY/s72-c/user1-chromium.png" height="72" width="72"/><thr:total>32</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-9003722968772147283</guid><pubDate>Sun, 13 Jan 2013 21:13:00 +0000</pubDate><atom:updated>2013-01-14T01:13:40.295+04:00</atom:updated><title>Тенденции применения парсинга и автоматизации в вебмастеринге и SEO</title><description>Думаю, все уже отошли от праздников и вовсю трудятся на свое собственное материальное благо. Вот и мне удается немного посидеть за компьютером.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Изучила некоторые тенденции, чего же интересно народу в интернете. В ряде следующих статей хочу приводить примеры программирования именно в тех областях, которые могут представлять интерес.&lt;/div&gt;
&lt;h3&gt;
Vk.com&lt;/h3&gt;
Началось с того, что посмотрела небольшое видео по продвижению пабликов в Vkontakte. Оказывается, уже немало софта написано для автоматизации постинга, парсинга чужих пабликов, проставления лайков и т.д..&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;strong&gt;Отступление:&lt;/strong&gt; если есть хороший софт с нужными функциями и поддержкой, то я предпочитаю заплатить. Так гораздо проще, чем самой писать с нуля. Именно поэтому я уже давно не занимаюсь парсингом выдачи, а использую KeyCollector. Для работы с социальной сетью vkontakte.ru многие используют Viking Botovod (я не тестировала, рекомендовать не могу, но видела промо-ролик).&lt;/blockquote&gt;
&lt;h3&gt;
Наполнение сайтов&lt;/h3&gt;
Как ни странно, но доргены до сих пор пользуются некоторой популярностью в узких кругах. Используются также и обычные парсеры: берется статья, проставляется ссылка на источник, и такая комбинация порой даже может стоять в выдаче выше оригинала.&lt;br /&gt;
&lt;br /&gt;
Я сама против подобного наполнения сайтов. К тому же есть множество альтернатив использования автоматизации при их создании. Ведь если подумать хорошенько, можно найти варианты гораздо лучше, чем тырить чужие статьи. Тем более, что в этом случае и совесть спокойна, и конфликты с недовольными владельцами ресурсов исключены.&lt;br /&gt;
&lt;h3&gt;
Мои эксперименты и их освещение на этом блоге&lt;/h3&gt;
Всем вебмастерам, кто только начинает заниматься своими проектами, хочется найти заветную кнопку &quot;Бабло&quot;. Кнопки такой не существует, но есть масса способов, которые могут сработать и принести хоть какую-никакую, но прибыль.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Скажу честно, я читала о всяких вариантах, но никогда их не пробовала реализовывать — всегда находились дела поважнее и, как большинство фрилансеров, испытывала нехватку свободного времени. Но сейчас решила немного себя перебороть и сделать что-нибудь &quot;новенькое&quot; для себя. Конечно же, нехватка времени в настоящий момент тоже остро стоит, но что делать...&lt;/div&gt;
&lt;h4&gt;
Эксперимент №1&lt;/h4&gt;
Программка для работы с Vkontakt-ом. С функционалом пока точно не определилась, решу по ходу. Пока приблизительно буду ориентироваться на тот же Viking. Конечно, будет не точь-в-точь.&lt;br /&gt;
&lt;br /&gt;
Как настоящий динозавр, буду писать ее на своем любимом Delphi7.&lt;br /&gt;
&lt;h4&gt;
Эксперимент №2&lt;/h4&gt;
В рамках эксперимента №2 хочу создать какой-нибудь сайт из разряда &quot;сделал и забыл&quot; или хотя бы &quot;сделал и подзабыл&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;b&gt;Как можно заработать на таком сайте?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Контекст. Ну, это мне знакомо, с этим я работаю.&lt;/li&gt;
&lt;li&gt;Сапа. Никогда не пробовала использовать, почему-то жалко 2 своих основных сайтика :) — можно попробовать.&lt;/li&gt;
&lt;li&gt;Партнерские программы.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Выбор тематики&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Сайт будет заточен под региональные запросы. Тематика — недвижимость. Статьи и новости — закажу рерайт. База по риэлторам, база по предложениям (с досок объявлений). За счет большого числа объявлений можно добиться большого количества страниц в выдаче. Только объявления надо будет чем-нибудь дополнить, что ли. Каждое предложение можно также сопроводить отметкой на Яндекс.Карте.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Особенности&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Буду делать не на привычных CMS, а напишу свои скриптики — читала о наблюдениях, что самописные сайты лучше воспринимаются поисковиками, чем на Wordpress/Joomla!.&lt;/div&gt;
&lt;br /&gt;
Работу над этими проектами буду вести неспешно (опять же, из-за невозможности долго сидеть за компьютером). Статьи будут чередоваться как попало :) Но, думаю, будет интересно. По крайней мере — мне. Если есть желание следить за ходом дел, приглашаю &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot; rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;. :)</description><link>http://parsing-and-i.blogspot.com/2013/01/webmaster-and-seo-experiments.html</link><author>noreply@blogger.com (Masha)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-8271401044801493408</guid><pubDate>Sun, 30 Dec 2012 21:50:00 +0000</pubDate><atom:updated>2012-12-31T01:51:29.040+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">блог</category><category domain="http://www.blogger.com/atom/ns#">жизнь</category><title>C новым годом!</title><description>Поздравляю всех читателей блога и случайных посетителей с Новым Годом!
Пусть в 2013-ом (и последующих) вас ожидает успешная реализация планов и проектов, энтузиазма в постижении нового, много всего интересного и вкусного :)&lt;br&gt;
&lt;br&gt;
Дальше несколько слов лытдыбра, можно не читать (а можно и прочесть).&lt;br&gt;
&lt;a href=&quot;http://parsing-and-i.blogspot.com/2012/12/happy-new-year.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2012/12/happy-new-year.html</link><author>noreply@blogger.com (Masha)</author><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-6524557064873721043</guid><pubDate>Thu, 10 Mar 2011 10:02:00 +0000</pubDate><atom:updated>2011-03-10T13:47:49.283+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">TWebBrowser</category><title>Delphi: Как удалить cookies из TWebBrowser?</title><description>В этой статье не будет ничего скандально нового :) Просто уже 2 комментатора спросили в заметке о &lt;a href=&quot;http://parsing-and-i.blogspot.com/2009/06/cookies-twebbrowser.html&quot;&gt;cookies в TWebBrowser&lt;/a&gt;, как их удалять. В гугле, ясно дело, решение найти просто, но почему-то для кого-то проще спросить и ждать :)&lt;br /&gt;&lt;br /&gt;В общем, если на мой блог о парсинге приходят по этому запросу, то надо на него ответить. :)&lt;br /&gt;&lt;br /&gt;Это готовое решение, взятое из инета и опробованное мной. В результате будут подчищены все файлы с куками, хранящиеся в &lt;span style=&quot;font-style:italic;&quot;&gt;c:\Documents and Settings\Имя_пользователя\Cookies&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;uses&lt;br /&gt;  WinInet;&lt;br /&gt;&lt;br /&gt;procedure DeleteIECache;&lt;br /&gt;var&lt;br /&gt;  lpEntryInfo: PInternetCacheEntryInfo;&lt;br /&gt;  hCacheDir: LongWord;&lt;br /&gt;  dwEntrySize: LongWord;&lt;br /&gt;begin&lt;br /&gt;  dwEntrySize := 0;&lt;br /&gt;  FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);&lt;br /&gt;  GetMem(lpEntryInfo, dwEntrySize);&lt;br /&gt;  if dwEntrySize &amp;gt; 0 then lpEntryInfo^.dwStructSize := dwEntrySize;&lt;br /&gt;  hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);&lt;br /&gt;  if hCacheDir &amp;lt;&amp;gt; 0 then &lt;br /&gt;  begin&lt;br /&gt;    repeat&lt;br /&gt;      DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);&lt;br /&gt;      FreeMem(lpEntryInfo, dwEntrySize);&lt;br /&gt;      dwEntrySize := 0;&lt;br /&gt;      FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);&lt;br /&gt;      GetMem(lpEntryInfo, dwEntrySize);&lt;br /&gt;      if dwEntrySize &amp;gt; 0 then lpEntryInfo^.dwStructSize := dwEntrySize;&lt;br /&gt;    until not FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize);&lt;br /&gt;  end;&lt;br /&gt;  FreeMem(lpEntryInfo, dwEntrySize);&lt;br /&gt;  FindCloseUrlCache(hCacheDir);&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Для чего может пригодиться очистка кукисов?&lt;/span&gt; Ну, например, вы написали какое-то свое приложение с TWebBrowser и заходите на определенный сайт через список прокси... ;)&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Сегодня объявляю гранд мерси &lt;span style=&quot;font-weight:bold;&quot;&gt;akkadites&lt;/span&gt;, автору блога &lt;a href=&quot;http://u-proga.co.cc/&quot;&gt;&quot;Обзор полезного софта&quot;&lt;/a&gt;, и &lt;a href=&quot;http://seorit.ru/&quot;&gt;Seorit.ru&lt;/a&gt; за обзоры &lt;a href=&quot;http://parsing-and-i.blogspot.com/2009/08/rssadder-rss-rss.html&quot;&gt;RSSAdder&lt;/a&gt;-а.&lt;br /&gt;___&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot;  rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.</description><link>http://parsing-and-i.blogspot.com/2011/03/delphi-how-to-delete-cookies-of.html</link><author>noreply@blogger.com (Masha)</author><thr:total>10</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-8519586850170829226</guid><pubDate>Fri, 25 Feb 2011 10:35:00 +0000</pubDate><atom:updated>2011-02-25T13:50:53.707+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><title>Delphi XE Starter за 199$ (5900 рублей)</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixr1jM5R9LUMkTpnAIvQcatVqGiS6wMTJLbXPkiSkqUVKcDgfubMz_BSpHlBO_A1_u030mmKbs1XJ4fr0CkUheYNCrfsBw4Jsm-A4xYG95KZM66o91S0dhEoEiOrwSBhrQ52hHx3p0xSg/s1600/delphi-xe.gif&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 105px; height: 99px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixr1jM5R9LUMkTpnAIvQcatVqGiS6wMTJLbXPkiSkqUVKcDgfubMz_BSpHlBO_A1_u030mmKbs1XJ4fr0CkUheYNCrfsBw4Jsm-A4xYG95KZM66o91S0dhEoEiOrwSBhrQ52hHx3p0xSg/s400/delphi-xe.gif&quot; border=&quot;0&quot; alt=&quot;Delphi XE&quot; id=&quot;BLOGGER_PHOTO_ID_5577577526846885506&quot; /&gt;&lt;/a&gt;Только ленивый программист-блоггер не написал еще об этой акции, проводимой Embarcadero. Продукт &lt;a href=&quot;http://www.embarcadero.com/products/delphi/starter&quot;&gt;Delphi XE Starter Edition&lt;/a&gt; можно купить за 199 баксов (или за 5900 рублей — &lt;a href=&quot;http://ibase.ru/prices/embarcadero.htm&quot;&gt;ссылка на прайс&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Естественно, что у такой лицензии есть ограничения (и для кого-то они критические). Например, она может быть использована только в том случае, если годовой профит от разработанного программного обеспечения не превышает $ 1000. То есть практически никакого профита ;) Но почему-то мне эта акция приглянулась и я хочу ей воспользоваться. Тем более, что при покупке Delphi XE покупатель автоматически получает Delphi 2010, 2009, 2007 и 7.&lt;br /&gt;&lt;br /&gt;Буду использовать эту лицензию конкретно дома (на работе все есть).&lt;br /&gt;&lt;br /&gt;А вы как думаете, стоит оно того?&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;P.S. Всем дельным комментаторам большое спасибо за комментарии. И вообще большое спасибо всем читателям блога за то, что вы есть. Как только работы поубавится — все разберу.&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot;  rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.</description><link>http://parsing-and-i.blogspot.com/2011/02/delphi-xe-starter-199-5900.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixr1jM5R9LUMkTpnAIvQcatVqGiS6wMTJLbXPkiSkqUVKcDgfubMz_BSpHlBO_A1_u030mmKbs1XJ4fr0CkUheYNCrfsBw4Jsm-A4xYG95KZM66o91S0dhEoEiOrwSBhrQ52hHx3p0xSg/s72-c/delphi-xe.gif" height="72" width="72"/><thr:total>8</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-3159810757004201156</guid><pubDate>Thu, 16 Dec 2010 11:56:00 +0000</pubDate><atom:updated>2010-12-16T15:18:46.002+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">разработка</category><title>Delphi: работа с классами, унаследованными от TList</title><description>Еще немного расскажу о своих &amp;quot;привычках&amp;quot; в программировании. Очень часто приходится работать со списком однотипных объектов. В этом случае создаю класс для объекта и класс для списка объектов, унаследованный от TList.&lt;br&gt;&lt;br&gt;Применяю это и в персерах. Вернее, при написании приложений, где необходим парсинг и последующая обработка полученных данных, но где использование базы данных было бы излишеством.&lt;br&gt;&lt;br&gt;Самый простой пример такой объектной организации:&lt;br&gt;&lt;pre&gt;TBASetting  = class&lt;br&gt;  BA              : string;&lt;br&gt;  MM_CONST        : integer;&lt;br&gt;  STRIKESTEP,&lt;br&gt;  MIN_STRIKE,&lt;br&gt;  MAX_STRIKE      : double;  &lt;br&gt;public&lt;br&gt;  constructor Create(const aPath: string; const aParams: TStrings); overload;&lt;br&gt;  ...&lt;br&gt;end;&lt;br&gt;&lt;br&gt;TBASettings = class(TList)&lt;br&gt;  ...&lt;br&gt;  function LoadFromINI (IniFile : TIniFile) : boolean;&lt;br&gt;  function SaveToINI (IniFile: TIniFile) : boolean;&lt;br&gt;  procedure Clear; override;&lt;br&gt;end;&lt;/pre&gt;&lt;br&gt;Остановлюсь подробнее на следующих пунктах:&lt;br&gt;- создание объектов, заполнение списка;&lt;br&gt;- освобождение памяти при &amp;quot;очистке&amp;quot; списка.&lt;br&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/12/delphi-tlist.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2010/12/delphi-tlist.html</link><author>noreply@blogger.com (Masha)</author><thr:total>9</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-7710400773677741512</guid><pubDate>Mon, 15 Nov 2010 19:38:00 +0000</pubDate><atom:updated>2010-11-16T00:27:37.442+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CURL</category><category domain="http://www.blogger.com/atom/ns#">Curlpas</category><category domain="http://www.blogger.com/atom/ns#">Delphi</category><title>Delphi: работа с cURL с помощью библиотеки-обертки Curlpas</title><description>&lt;a href=&quot;http://parsing-and-i.blogspot.com/2009/03/internet-direct-indy.html&quot; title=&quot;Знакомство с Indy&quot;&gt;Indy&lt;/a&gt; и &lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/02/synapse-in-delphi-first-steps.html&quot; title=&quot;Знакомство с Synapse&quot;&gt;Synapse&lt;/a&gt; вам надоели? Самое время попробовать что-нибудь новенькое :)&lt;br /&gt;&lt;br /&gt;Если кто-нибудь, начитавшись статей про &lt;a href=&quot;http://parsing-and-i.blogspot.com/2009/09/curl-first-steps.html&quot; title=&quot;Начало работы с cURL в PHP&quot;&gt;cURL&lt;/a&gt; (я писала не раз про работу с cURL в PHP), решит попробовать работать с этой библиотекой и в Delphi, то ничего сложного в этом нет.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Установка CURL и работа с этой библиотекой в Delphi 7&lt;/h2&gt;&lt;br /&gt;1. Скачиваем файлы библиотеки libcurl с сайта разработчика по &lt;a href=&quot;http://curl.haxx.se/download.html&quot; rel=&quot;nofollow&quot; title=&quot;Исходники libcurl&quot;&gt;ссылке&lt;/a&gt;. Из всего разнообразия выбираем те, что подходят для нашей операционки. В моем случае это:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFzplossvIjAHQOKXitov45l7xGk3n2Ni8akr2svnxdrARm9S9yXjhQ1uFbrVfbl0FMQhntqwkDAwxiHt_d1wqg8NCE7mbA4iAn84eCJDT_KcR4qGGMQXUb000h5PZzTEJffy57BPn-UA/s1600/win_lib_download.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 70px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFzplossvIjAHQOKXitov45l7xGk3n2Ni8akr2svnxdrARm9S9yXjhQ1uFbrVfbl0FMQhntqwkDAwxiHt_d1wqg8NCE7mbA4iAn84eCJDT_KcR4qGGMQXUb000h5PZzTEJffy57BPn-UA/s400/win_lib_download.gif&quot; border=&quot;0&quot; alt=&quot;libcurl для Windows&quot; title=&quot;libcurl для Windows&quot; id=&quot;BLOGGER_PHOTO_ID_5539885173733979074&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Содержимое папки &lt;span style=&quot;font-weight:bold;&quot;&gt;bin&lt;/span&gt; из скачанного архива копируем в &lt;span style=&quot;font-style:italic;&quot;&gt;C:\WINDOWS\system32\&lt;/span&gt;. Там несколько файлов dll:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv9YkCpgr2gWXhyphenhyphenQH1nP271kF8FkKYyuPVeTWeaB95ndZ6-tLYvvZfbXNP5ILGWtpNMYBTTvgNQfZiJ__nsnvBVEZ6FGL9bTzwJC8LQaT8eUY4khYUhx8HBST-KkLUT2Wm10Xkfe3NgTo/s1600/curl_lib_files.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 190px; height: 151px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv9YkCpgr2gWXhyphenhyphenQH1nP271kF8FkKYyuPVeTWeaB95ndZ6-tLYvvZfbXNP5ILGWtpNMYBTTvgNQfZiJ__nsnvBVEZ6FGL9bTzwJC8LQaT8eUY4khYUhx8HBST-KkLUT2Wm10Xkfe3NgTo/s400/curl_lib_files.gif&quot; border=&quot;0&quot; alt=&quot;Файлы библиотеки libcurl&quot; id=&quot;BLOGGER_PHOTO_ID_5539885706026653442&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Скачиваем готовую библиотеку-обертку &lt;a href=&quot;http://sourceforge.net/projects/curlpas/files/&quot; rel=&quot;nofollow&quot; title=&quot;Библиотека для работы с CURL в Delphi — CurlPas&quot;&gt;CurlPas&lt;/a&gt; для работы с libcurl.&lt;br /&gt;&lt;br /&gt;3. Распаковываем архив куда-нибудь, например, в &lt;span style=&quot;font-style:italic;&quot;&gt;C:\Program Files\Borland\Delphi7\Source\Curlpas\&lt;/span&gt;. Обратите внимание, в архиве есть еще документация и примеры использования (папка demo).&lt;br /&gt;&lt;br /&gt;4. Запускаем батник &lt;span style=&quot;font-style:italic;&quot;&gt;Makewin.bat&lt;/span&gt; с параметром &lt;span style=&quot;font-style:italic;&quot;&gt;src&lt;/span&gt; (или &lt;span style=&quot;font-style:italic;&quot;&gt;all&lt;/span&gt;, чтобы уж не мелочиться :) ).&lt;br /&gt;&lt;br /&gt;Смотрим лог выполнения инструкций. Там должно быть что-то вроде &quot;все успешно&quot; по каждой директиве.&lt;br /&gt;&lt;br /&gt;5. Можно приступать к тестированию библиотеки. Создаем приложение.&lt;br /&gt;&lt;br /&gt;В uses прописываем:&lt;br /&gt;&lt;pre&gt;uses&lt;br /&gt;  ... curlobj;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Помещаем на форму кнопку, в обработчике нажатия пишем код:&lt;br /&gt;&lt;pre&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var &lt;br /&gt;  Curl: TCurl;&lt;br /&gt;begin&lt;br /&gt;  Curl := TCurl.Create(nil);&lt;br /&gt;  Curl.URL := &#39;http://parsing-and-i.blogspot.com/&#39;;&lt;br /&gt;  Curl.OutputFile := &#39;curl.html&#39;;&lt;br /&gt;  if not Curl.Perform then&lt;br /&gt;    ShowMessage(Curl.ErrorString);&lt;br /&gt;  Curl.Free;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;Запускаем. Все должно без проблем скомпилиться, в итоге после нажатия кнопки в папке с проектом появится файл curl.html с html-кодом главной страницы &lt;a href=&quot;http://parsing-and-i.blogspot.com/&quot;&gt;моего блога&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Возможные ошибки при установке Curlpas&lt;/h2&gt;&lt;br /&gt;По каким-то причинам могут не &quot;подхватиться&quot; библиотеки. Тогда после запуска приложения может появиться что-то типа такого сообщения:&lt;br /&gt;&lt;div class=&quot;error&quot;&gt;Приложению не удалось запуститься, поскольку libcurl-3.dll не был найден. Повторная установка приложения может решить эту проблему.&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEa7ZShzc9r1wot-umuN4LcR5dDY7NSXVUokgjuw4R0AW17uawkewQtMvJLh14FUTROaL21ZyRXRCpi-4q8hO2_pJRGcipys_EAojwpaPjzisOGwV9MnZ02LGIQGoagfCwdxj51kq9XWg/s1600/curl_error.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 61px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEa7ZShzc9r1wot-umuN4LcR5dDY7NSXVUokgjuw4R0AW17uawkewQtMvJLh14FUTROaL21ZyRXRCpi-4q8hO2_pJRGcipys_EAojwpaPjzisOGwV9MnZ02LGIQGoagfCwdxj51kq9XWg/s400/curl_error.jpg&quot; border=&quot;0&quot; alt=&quot;Ошибка при установке libcurl в Delphi&quot; title=&quot;Ошибка при установке libcurl в Delphi&quot; id=&quot;BLOGGER_PHOTO_ID_5539888362659737906&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Если компилятор запрашивает файл &lt;span style=&quot;font-style:italic;&quot;&gt;libcurl-3.dll&lt;/span&gt;, а в скачанном пакете &lt;span style=&quot;font-weight:bold;&quot;&gt;libcurl&lt;/span&gt; у вас файл называется &lt;span style=&quot;font-style:italic;&quot;&gt;libcurl.dll&lt;/span&gt; (зависит от версии библиотеки), то найдите файл &lt;span style=&quot;font-style:italic;&quot;&gt;curl_h.pas&lt;/span&gt; (из папки &lt;span style=&quot;font-style:italic;&quot;&gt;C:\Program Files\Borland\Delphi7\Source\Curlpas\src\&lt;/span&gt;, если вы устанавливали по моей инструкции) и в нем исправьте название файла.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1wYin5eEJ9XXyIuMhcWh4q9pMlwp927voNvBkf6L5r5V7KXoQVmv5ar47op0dn1e6M4pjHZswkFE8yC9zv3jlOnBqB55yqngV-IDMw-Du-aUu1tBLiyZ4x2FNB9PrUtGCDlcpYpR-Lno/s1600/curl_h.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 361px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1wYin5eEJ9XXyIuMhcWh4q9pMlwp927voNvBkf6L5r5V7KXoQVmv5ar47op0dn1e6M4pjHZswkFE8yC9zv3jlOnBqB55yqngV-IDMw-Du-aUu1tBLiyZ4x2FNB9PrUtGCDlcpYpR-Lno/s400/curl_h.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539887253963638050&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Потом перекомпилируйте библиотеку.&lt;br /&gt;&lt;br /&gt;Если не находятся какие-то другие dll — еще раз проверьте их наличие в &lt;span style=&quot;font-style:italic;&quot;&gt;System32&lt;/span&gt; (или другом каталоге, как у вас принято).&lt;br /&gt;&lt;br /&gt;Вот, в общем-то, и все — установка завершена, можете работать с библиотекой дальше. В папке &lt;span style=&quot;font-style:italic;&quot;&gt;doc&lt;/span&gt; — достаточно полная документация. А онлайн документация есть &lt;a href=&quot;http://curlpas.sourceforge.net/doc/&quot; rel=&quot;nofollow&quot; title=&quot;Онлайн-документация по CurlPas&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot;  rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.</description><link>http://parsing-and-i.blogspot.com/2010/11/delphi-curl-curlpas.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFzplossvIjAHQOKXitov45l7xGk3n2Ni8akr2svnxdrARm9S9yXjhQ1uFbrVfbl0FMQhntqwkDAwxiHt_d1wqg8NCE7mbA4iAn84eCJDT_KcR4qGGMQXUb000h5PZzTEJffy57BPn-UA/s72-c/win_lib_download.gif" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-4744088686505509160</guid><pubDate>Wed, 10 Nov 2010 12:37:00 +0000</pubDate><atom:updated>2010-11-10T16:48:25.935+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">жизнь</category><title>И снова с вами...</title><description>Два месяца не появлялась, на то были причины. Понемногу начну исправляться: разгребать почту, чистить комменты (очень много спама, а я по старинке привыкла доверять людям и захожу по каждому адресу, указанному комментаторами), смотреть зафоловивших меня в твиттере. Писем в ящике, указанном в профиле, очень много. Это мой неосновной ящик, поэтому только-только добралась. Даже не знаю, как поступить: отвечать или не отвечать на &quot;старые&quot; предложения (наверное, у них уже вышел &quot;срок годности&quot;. Тут дилема: предстать невежливой или предстать тормозом :) ).&lt;br /&gt;&lt;br /&gt;Начало осени было очень насыщенным: периоды интенсивной работы чередовались с интенсивным же отдыхом. Съездили с мужем отдохнуть в Таиланд. Несколько фоток.&lt;br /&gt;&lt;br /&gt;Одно из &quot;обычных состояний&quot; — с картой в руках. Я — навигатор :)&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgNdG9FwBT-jd5GbSoBkcsf6hq0ArVMP2mx7-o6_8kOSeWtwX2B_5kmn-HsBVGl6u8_ElKljiIxV-LpqDuVD4NpD0d1KUf9tzdKf5H7PA8zqUUNtmnOrJgM46g6LeQlmO7oYQMWOLpu78/s1600/x_d44cddee.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgNdG9FwBT-jd5GbSoBkcsf6hq0ArVMP2mx7-o6_8kOSeWtwX2B_5kmn-HsBVGl6u8_ElKljiIxV-LpqDuVD4NpD0d1KUf9tzdKf5H7PA8zqUUNtmnOrJgM46g6LeQlmO7oYQMWOLpu78/s320/x_d44cddee.jpg&quot; border=&quot;0&quot; alt=&quot;Тайланд, Бангкок&quot; id=&quot;BLOGGER_PHOTO_ID_5537900301523903490&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Я и кузнечик: кто кого?&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ0orwmOS7J-3mFW_ZOLTGq3wtyaxkyMTrAcfnYKmI68aEvNx155uiXS0zMvG5CexTBlz0D0_80oCp2dGHpR_0r17paqxeyjDeCKqXQgnf3XsMU5TlYVYahPMy0Xtp3VRAtf6uKT8z6IA/s1600/x_a278319f.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ0orwmOS7J-3mFW_ZOLTGq3wtyaxkyMTrAcfnYKmI68aEvNx155uiXS0zMvG5CexTBlz0D0_80oCp2dGHpR_0r17paqxeyjDeCKqXQgnf3XsMU5TlYVYahPMy0Xtp3VRAtf6uKT8z6IA/s320/x_a278319f.jpg&quot; border=&quot;0&quot; alt=&quot;Паттайя. Кузнечик&quot;id=&quot;BLOGGER_PHOTO_ID_5537900313341235074&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Ну и широко известные тайские мальчики-девочки. Это самые &quot;очевидные&quot;. Большинство же такие, что для идентификации надо приглядеться :)&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivRzFnvuf9b5dFJ7CUoI4qRT5f0BZ9Tsh-nMA-poNTSNF32HaMn94OR1UWAvF2mE31wpxLg5Yti77GwPFnGOvyIh6hICHT_qdFnFzFMJ4YkbTuV7kUWDOuYGuMcAg1Pcqx0iH4jRKKH1g/s1600/x_ae4581cd.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivRzFnvuf9b5dFJ7CUoI4qRT5f0BZ9Tsh-nMA-poNTSNF32HaMn94OR1UWAvF2mE31wpxLg5Yti77GwPFnGOvyIh6hICHT_qdFnFzFMJ4YkbTuV7kUWDOuYGuMcAg1Pcqx0iH4jRKKH1g/s320/x_ae4581cd.jpg&quot; border=&quot;0&quot; alt=&quot;Тайские девочки (в кавычках)&quot;id=&quot;BLOGGER_PHOTO_ID_5537900322690230802&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Фотографий привезли — море. Но здесь им, конечно, не место :)&lt;br /&gt;&lt;br /&gt;Замечательная страна. Всерьез подумываем поселиться там и пожить некоторое время. Естественно, что для этого надо трудиться и налаживать источники доходов, не привязанные к месту жительства. В принципе, чем мы сейчас и занимаемся.&lt;br /&gt;&lt;br /&gt;Парсеры на заказ в настоящее время не пишу, обращаться не стоит. Пишу приложения для торговли на бирже с использованием &lt;a href=&quot;http://ttools.ru/?page_id=430#10&quot;&gt;QuikOrdersDOM SDK&lt;/a&gt; (SDK для работы с Квиком). Занимаюсь своими проектами (это как раз относится к &quot;налаживанию источников дохода&quot;, о котором упоминалось в предыдущем абзаце). Для своих проектов программирую по мелочам, так что, в принципе, писать на блоге есть о чем — в ближайшем будущем посты ожидаются :)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Товарищи!&lt;/span&gt; По поводу &lt;a href=&quot;http://parsing-and-i.blogspot.com/2009/08/rssadder-rss-rss.html&quot;&gt;RSSAdder-а&lt;/a&gt;. В свое время я обещала постовые всем, кто напишет обзор у себя на блогах. Я про это не забыла, только вот вычислить написавших мне трудно: blogger не показывает, а самой мне искать совсем некогда. Оставляйте в комментах ссылки на обзоры — все обещанные постовые будут размещены в новых записях на этом блоге.&lt;br /&gt;&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Зачем тянуть с объявлением благодарностей? :) Спасибо &lt;span style=&quot;font-weight:bold;&quot;&gt;artcher-у&lt;/span&gt;, автору блога &lt;a href=&quot;http://artcher.net&quot;&gt;&quot;Web как философия жизни&quot;&lt;/a&gt; за прекрасный &lt;a href=&quot;http://artcher.net/2010/10/31/&quot;&gt;обзор RSSAdder-а с картинками&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Так же спасибо &lt;a href=&quot;http://www.seozip.ru/&quot;&gt;SeoZIP-у&lt;/a&gt; ) Желаю удачи в развитии блога!&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot;  rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.</description><link>http://parsing-and-i.blogspot.com/2010/11/blog-post.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgNdG9FwBT-jd5GbSoBkcsf6hq0ArVMP2mx7-o6_8kOSeWtwX2B_5kmn-HsBVGl6u8_ElKljiIxV-LpqDuVD4NpD0d1KUf9tzdKf5H7PA8zqUUNtmnOrJgM46g6LeQlmO7oYQMWOLpu78/s72-c/x_d44cddee.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-6097858155597548034</guid><pubDate>Tue, 24 Aug 2010 10:41:00 +0000</pubDate><atom:updated>2010-08-24T14:49:54.228+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">RSSAdder</category><title>RSSAdder: обновление конфига</title><description>Приветствую всех, кто пользуется утилитой &lt;a href=&quot;http://parsing-and-i.blogspot.com/2009/08/rssadder-rss-rss.html&quot;&gt;RSSAdder&lt;/a&gt; для полуавтоматического добавления RSS-лент в RSS-агрегаторы.&lt;br /&gt;&lt;br /&gt;Выкладываю новый конфиг. Этот конфиг &quot;увидел свет&quot; благодаря &lt;a href=&quot;http://dsi5.org.ua/&quot;&gt;Никите&lt;/a&gt;, который прислал свои исправления (из списка удалено 2 неработающих агрегатора) и добавления (добавлено аж 27 новых агрегаторов!), за что ему &lt;span style=&quot;font-weight:bold;&quot;&gt;огромное спасибо&lt;/span&gt; :)&lt;br /&gt;&lt;br /&gt;Сама я новый список еще не тестировала, но, наверное, вскоре пройдусь по нему.&lt;br /&gt;&lt;br /&gt;Ссылка для скачивания: &lt;a href=&quot;http://narod.ru/disk/24043375000/RSSAdder.ini.html&quot;&gt;новый конфиг для RSSAdder-а (82 агрегатора)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Надеюсь, всем пригодится :)</description><link>http://parsing-and-i.blogspot.com/2010/08/rssadder.html</link><author>noreply@blogger.com (Masha)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-4871971988147657319</guid><pubDate>Sun, 15 Aug 2010 20:24:00 +0000</pubDate><atom:updated>2010-08-16T00:29:29.661+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">RegExp</category><title>Delphi: работа с RegExp в dll</title><description>&lt;span style=&quot;font-weight:bold;&quot;&gt;Как работать с RegExp в библиотеках?&lt;/span&gt; Дело в том, что библиотека &lt;span style=&quot;font-weight:bold;&quot;&gt;VBScript_RegExp_55_TLB&lt;/span&gt; — майкрософтская, без проблем тут не обошлось.&lt;br /&gt;&lt;br /&gt;Вроде экземпляр объекта TRegExp создается, но при попытке с ним поработать вылазит ошибка:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;error&quot;&gt;Не был произведен вызов CoInitialize.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Если честно, столкнулась с этим впервые, пошла в интернет искать. Пришлось подключать &lt;span style=&quot;font-weight:bold;&quot;&gt;ActiveX&lt;/span&gt; и использовать &lt;span style=&quot;font-weight:bold;&quot;&gt;CoInitialize/CoUninitialize&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Нашла &lt;a href=&quot;http://chrisbensen.blogspot.com/2007/06/delphi-tips-and-tricks.html&quot; rel=&quot;nofollow&quot;&gt;статью про подобную проблему&lt;/a&gt;. Попробовала так:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var&lt;br /&gt;  ...&lt;br /&gt;  RE                  : TRegExp;&lt;br /&gt;  NeedToUninitialize  : Boolean;&lt;br /&gt;begin&lt;br /&gt;  NeedToUninitialize := Succeeded(CoInitialize(nil));&lt;br /&gt;  try&lt;br /&gt;    RE := TRegExp.Create(nil);&lt;br /&gt;    RE.IgnoreCase := true;&lt;br /&gt;    RE.Multiline := true;&lt;br /&gt;    RE.Global := true;&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;  finally&lt;br /&gt;    RE.Free;&lt;br /&gt;    if NeedToUninitialize then CoUninitialize;&lt;br /&gt;  end;&lt;br /&gt;...&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Но и тут не заладилось: если &lt;span style=&quot;font-weight:bold;&quot;&gt;CoUninitialize&lt;/span&gt; писать без &lt;span style=&quot;font-weight:bold;&quot;&gt;try...except&lt;/span&gt;, то на нем вываливается. И что-то мне эта ситуация совсем не понравилась, как-то мутно: коинициализируется — а потом что? Не будет ли проблем, если работать с библиотекой в несколько потоков и т.д.? Даже если CoInitialize/CoUninitialize делать не в функции, а при регистрации либы.&lt;br /&gt;&lt;br /&gt;Кто-нибудь из читателей блога сталкивался с чем-нибудь подобным? Как решали?&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot;  rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.</description><link>http://parsing-and-i.blogspot.com/2010/08/delphi-regexp-dll.html</link><author>noreply@blogger.com (Masha)</author><thr:total>12</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-459392915106420607</guid><pubDate>Mon, 19 Jul 2010 08:54:00 +0000</pubDate><atom:updated>2010-07-19T13:11:03.301+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Simple HTML DOM</category><title>Навигация по DOM-дереву в html</title><description>Сегодня статья опять будет про &lt;span style=&quot;font-weight:bold;&quot;&gt;PHP Simple Html DOM Parser&lt;/span&gt;. Даже несмотря на то, что некоторым читателям эта тема могла хорошенько поднадоесть. :) Просто хочется собрать на блоге достаточное количество материала, к которому можно было бы отсылать вопрошающих по емэйлу.&lt;br&gt;&lt;br&gt;Итак, &lt;span style=&quot;font-weight:bold;&quot;&gt;навигация по DOM-дереву&lt;/span&gt;. Прямо здесь. Прямо сейчас. На примерах. (Так как теоретически она и так описана в инструкции к библиотеке).&lt;br&gt;&lt;br&gt;Если вы читаете эту статью, то вам уже известно, что такое DOM-структура, древовидное представление данных, узлы дерева, родитель, потомок и т.д.. Структуру html-документа в виде дерева можно наглядно посмотреть в Firebug-е.&lt;br&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIIcKvsDR74io0UnGb85l0uq1D796watCLbqo9y_J8z1SRNRQJEB24mgazfYx6lfgw_Szo5Ci_sIQxAUpeF1cv6mf6BjKuVpa4kIt0R9VKwJrikNEJobpq47WZqUVExeXINBb6hCycKiw/s1600/html_firebug.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 119px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIIcKvsDR74io0UnGb85l0uq1D796watCLbqo9y_J8z1SRNRQJEB24mgazfYx6lfgw_Szo5Ci_sIQxAUpeF1cv6mf6BjKuVpa4kIt0R9VKwJrikNEJobpq47WZqUVExeXINBb6hCycKiw/s400/html_firebug.png&quot; border=&quot;0&quot; alt=&quot;Древовидная структура html-документа в firebug&quot; title=&quot;Древовидная структура html-документа в firebug&quot; id=&quot;BLOGGER_PHOTO_ID_5495538808753023474&quot;&gt;&lt;/a&gt;&lt;br&gt;Там же есть закладка DOM, с содержимым которой советую ознакомиться новичкам. Из структуры, которая там раскрывается, вы наглядно увидите результаты обращения к дочерним элементам, отдельным узлам, свойствам, атрибутам и т.д..&lt;br&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4A1kWzHzUly-X4maxAqPqaAB-Hp6xhOEbInw_u3_xI4hnKf8WD1Up4gvU_QELyjvieW79plTL5jgieRdvyVwwI2ifqGavz4wiBSXkYe3BEcpFx1Vr_GU9Raxg8Zalb09PvKd9bOJsu58/s1600/dom_firebug.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 119px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4A1kWzHzUly-X4maxAqPqaAB-Hp6xhOEbInw_u3_xI4hnKf8WD1Up4gvU_QELyjvieW79plTL5jgieRdvyVwwI2ifqGavz4wiBSXkYe3BEcpFx1Vr_GU9Raxg8Zalb09PvKd9bOJsu58/s400/dom_firebug.png&quot; border=&quot;0&quot; alt=&quot;DOM-структура html-документа в firebug&quot; title=&quot;DOM-структура html-документа в firebug&quot; id=&quot;BLOGGER_PHOTO_ID_5495538816949525890&quot;&gt;&lt;/a&gt;&lt;br&gt;Но вернемся к PHP Simple Html DOM Parser.&lt;br&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/07/dom-html.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2010/07/dom-html.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIIcKvsDR74io0UnGb85l0uq1D796watCLbqo9y_J8z1SRNRQJEB24mgazfYx6lfgw_Szo5Ci_sIQxAUpeF1cv6mf6BjKuVpa4kIt0R9VKwJrikNEJobpq47WZqUVExeXINBb6hCycKiw/s72-c/html_firebug.png" height="72" width="72"/><thr:total>8</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-4951304330906720721</guid><pubDate>Thu, 08 Jul 2010 07:58:00 +0000</pubDate><atom:updated>2010-07-28T11:08:51.851+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">компоненты и библиотеки Delphi</category><title>Delphi: отладка, запись в лог</title><description>Давненько не писала про Delphi, а ведь именно в Delphi провожу большую часть дня :) Итак, сегодня расскажу о том, как я пишу логи.&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Запись в лог&lt;/span&gt; я использую во всех более-менее серьезных проектах. Логирование помогает и на этапе отладки, и на этапе внедрения (иногда проще попросить прислать лог, чем со слов понять, в чем проблема). Давно уже использую для этих целей маленькую и удобную библиотечку &lt;span style=&quot;font-weight:bold;&quot;&gt;uLog&lt;/span&gt;. Все, что от вас потребуется, это добавить ее в uses. Ну и по желанию некоторые настройки. Но даже уже без всяких настроек вы можете писать в лог с помощью процедуры sLog. Пример:&lt;br&gt;&lt;pre&gt;sLog (&amp;#39;MyProgram.log&amp;#39;,&amp;#39;Значение переменной =&amp;#39;+str);&lt;/pre&gt;&lt;br&gt;Первый входной параметр — куда писать, второй — что писать. Если путь прописан не полностью — идет обращение к текущей директории проекта. Если файл не существует - он будет создан автоматически. В логе строчки появляются снабженные временем записи в лог. Пример части лога:&lt;br&gt;&lt;pre&gt;07.07.2010 16:34:11 [243] Starting...&lt;br&gt;07.07.2010 16:34:11 [243] Signature:A951D217D6B5E340 03040002 940000000500000001000000280A00000200000053657276696365205061636B2032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&lt;br&gt;07.07.2010 16:34:11 [243] LoadConf...&lt;/pre&gt;(в квадратных скобках после времени - миллисекунды)&lt;br&gt;&lt;br&gt;Немного о настройках. Первое, что можно настраивать, - это файл по умолчанию, в который будет писаться лог. Для этого обращаемся к &lt;span style=&quot;font-style:italic;&quot;&gt;uLog.LogFileName&lt;/span&gt;.&lt;br&gt;Пример:&lt;br&gt;&lt;pre&gt;uLog.LogFileName := ExtractFilePath(GetModuleName(HInstance))+&amp;#39;TaskManager.log&amp;#39;;&lt;/pre&gt;&lt;br&gt;После установки LogFileName лог будет писаться в указанный файл, если первый входной параметр у sLog не будет задан:&lt;br&gt;&lt;pre&gt;sLog(&amp;#39;&amp;#39;,&amp;#39;Инициализация прошла успешно&amp;#39;);&lt;/pre&gt;&lt;br&gt;Еще один параметр - &lt;span style=&quot;font-style:italic;&quot;&gt;EnableMessages&lt;/span&gt;. Он отвечает за то, будут ли появляться сообщения об ошибке в этой библиотеке (например, когда файл лога не указан и не задан по умолчанию).&lt;br&gt;&lt;pre&gt;uLog.EnableMessages := false;&lt;/pre&gt;&lt;br&gt;И, наконец, самый замечательный параметр. Он передается в sLog третьим. Это &amp;quot;уровень логирования&amp;quot;, &lt;span style=&quot;font-style:italic;&quot;&gt;LogLevel&lt;/span&gt;.&lt;br&gt;&lt;pre&gt;slog(&amp;#39;&amp;#39;,&amp;#39;Starting library&amp;#39;,2);&lt;br&gt;slog(&amp;#39;&amp;#39;,tmpS,3);&lt;/pre&gt;&lt;br&gt;Вы сами проставляете этот уровень в зависимости от того, что за информацию пишете в лог. Градация, например, может быть такой:&lt;br&gt;&lt;ol&gt;&lt;li&gt;мегаважный&lt;/li&gt;&lt;br&gt;&lt;li&gt;информационный (запустился, ...)&lt;/li&gt;&lt;br&gt;&lt;li&gt;отладочный&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;Уровней может быть больше, сколько угодно. При приведенном в предыдущем абзаце варианте вы на этапе разработки используете LogLevel := 3, а когда устанавливаете продукт клиенту, ставите LogLevel 1 или 2. LogLevel удобно задавать в ini-файле и считывать при запуске приложения. Если вдруг у клиента внезапно начнутся какие-то сбои - под вашим руководством он сможет поменять уровень логирования на 3 и прислать вам файл с отладочной информацией, которая поможет вам выяснить причину сбоев.&lt;br&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/07/delphi.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2010/07/delphi.html</link><author>noreply@blogger.com (Masha)</author><thr:total>14</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-4979275016597151313</guid><pubDate>Fri, 25 Jun 2010 21:10:00 +0000</pubDate><atom:updated>2010-06-26T01:27:35.103+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">парсинг</category><category domain="http://www.blogger.com/atom/ns#">регулярные выражения</category><title>Очистка текста от лишних html-тегов</title><description>С задачей очистки html от лишних тегов сталкиваются абсолютно все.&lt;br /&gt;&lt;br /&gt;Первое, что приходит на ум, это использовать php-функцию strip_tags():&lt;br /&gt;&lt;pre&gt;string strip_tags (string str [, string allowable_tags])&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Функция возвращает строку, очищенную от тегов. В качестве аргумента &lt;span style=&quot;font-weight:bold;&quot;&gt;allowable_tags&lt;/span&gt; передаются теги, которые &lt;span style=&quot;font-weight:bold;&quot;&gt;не надо удалять&lt;/span&gt;. Функция работает, но, мягко говоря, неидеально. По ходу, там нет проверки на валидность кода, что может повлечь за собой удаление текста, не входящего в тэги.&lt;br /&gt;Инициативные разработчики сложа руки не сидели — в сети можно найти доработанные функции. Хорошим примером является &lt;a href=&quot;http://forum.dklab.ru/viewtopic.php?p=153841&quot; rel=&quot;nofollow&quot;&gt;strip_tags_smart&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Применять или не применять готовые решения — личный выбор программиста. Так сложилось, что мне чаще всего не требуется &quot;универсального&quot; обработчика и бывает удобнее почистить код регулярками.&lt;br /&gt;&lt;br /&gt;От чего зависит выбор того или иного способа обработки?&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;1. От исходного материала и сложности его анализа.&lt;/span&gt;&lt;br /&gt;Если вам нужно обрабатывать достаточно простые htmp-тексты, без какой-либо навороченной верстки, ясные, как день :), то можно использовать стандартные функции.&lt;br /&gt;Если в текстах есть определенные особенности, которые надо учесть, то тут-то и пишутся специальные обработчики. В одних может использоваться просто &lt;span style=&quot;font-weight:bold;&quot;&gt;str_replace&lt;/span&gt;. Например:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$s = array(&amp;#39;&amp;amp;acirc;&amp;amp;euro;&amp;amp;trade;&amp;#39; =&amp;gt; &amp;#39;&amp;amp;rsquo;&amp;#39;,         // Right-apostrophe (eg in I&amp;#39;m)&lt;br /&gt;  &amp;#39;&amp;amp;acirc;&amp;amp;euro;&amp;amp;oelig;&amp;#39; =&amp;gt; &amp;#39;&amp;amp;ldquo;&amp;#39;,                  // Opening speech mark&lt;br /&gt;  &amp;#39;&amp;amp;acirc;&amp;amp;euro;&amp;amp;ldquo;&amp;#39; =&amp;gt; &amp;#39;&amp;amp;mdash;&amp;#39;,                  // Long dash&lt;br /&gt;  &amp;#39;&amp;amp;acirc;&amp;amp;euro;&amp;#39; =&amp;gt; &amp;#39;&amp;amp;rdquo;&amp;#39;,                         // Closing speech mark&lt;br /&gt;  &amp;#39;&amp;amp;Atilde;&amp;amp;copy;&amp;#39; =&amp;gt; &amp;#39;&amp;amp;eacute;&amp;#39;,                       // e acute accent&lt;br /&gt;  chr(226) . chr(128) . chr(153) =&amp;gt; &amp;#39;&amp;amp;rsquo;&amp;#39;,          // Right-apostrophe again&lt;br /&gt;  chr(226) . chr(128) . chr(147) =&amp;gt; &amp;#39;&amp;amp;mdash;&amp;#39;,          // Long dash again&lt;br /&gt;  chr(226) . chr(128) . chr(156) =&amp;gt; &amp;#39;&amp;amp;ldquo;&amp;#39;,          // Opening speech mark&lt;br /&gt;  chr(226) . chr(128) . chr(148) =&amp;gt; &amp;#39;&amp;amp;mdash;&amp;#39;,          // M dash again&lt;br /&gt;  chr(226) . chr(128) =&amp;gt; &amp;#39;&amp;amp;rdquo;&amp;#39;,                     // Right speech mark&lt;br /&gt;  chr(195) . chr(169) =&amp;gt; &amp;#39;&amp;amp;eacute;&amp;#39;,                    // e acute again&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;foreach ($s as $needle =&gt; $replace)&lt;br /&gt;  {&lt;br /&gt;    $htmlText = str_replace($needle, $replace, $htmlText);&lt;br /&gt;  }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Другие могут быть основаны на &lt;span style=&quot;font-weight:bold;&quot;&gt;регулярных выражениях&lt;/span&gt;. Как пример:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;function getTextFromHTML($htmlText)&lt;br /&gt;{&lt;br /&gt;    $search = array (&amp;quot;&amp;#39;&amp;lt;script[^&amp;gt;]*?&amp;gt;.*?&amp;lt;/script&amp;gt;&amp;#39;si&amp;quot;,  // Remove javaScript &lt;br /&gt;       &amp;quot;&amp;#39;&amp;lt;style[^&amp;gt;]*?&amp;gt;.*?&amp;lt;/style&amp;gt;&amp;#39;si&amp;quot;,  // Remove styles &lt;br /&gt;       &amp;quot;&amp;#39;&amp;lt;xml[^&amp;gt;]*?&amp;gt;.*?&amp;lt;/xml&amp;gt;&amp;#39;si&amp;quot;,  // Remove xml tags &lt;br /&gt;       &amp;quot;&amp;#39;&amp;lt;[\/\!]*?[^&amp;lt;&amp;gt;]*?&amp;gt;&amp;#39;si&amp;quot;,           // Remove HTML-tags &lt;br /&gt;       &amp;quot;&amp;#39;([\r\n])[\s] &amp;#39;&amp;quot;,                 // Remove spaces&lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(quot|#34);&amp;#39;i&amp;quot;,                 // Replace HTML special chars&lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(amp|#38);&amp;#39;i&amp;quot;, &lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(lt|#60);&amp;#39;i&amp;quot;, &lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(gt|#62);&amp;#39;i&amp;quot;, &lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(nbsp|#160);&amp;#39;i&amp;quot;, &lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(iexcl|#161);&amp;#39;i&amp;quot;, &lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(cent|#162);&amp;#39;i&amp;quot;, &lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(pound|#163);&amp;#39;i&amp;quot;, &lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;(copy|#169);&amp;#39;i&amp;quot;, &lt;br /&gt;       &amp;quot;&amp;#39;&amp;amp;#(\d );&amp;#39;e&amp;quot;);                    // write as php&lt;br /&gt;&lt;br /&gt;    $replace = array (&amp;quot;&amp;quot;, &lt;br /&gt;                      &amp;quot;&amp;quot;, &lt;br /&gt;                      &amp;quot;&amp;quot;,&lt;br /&gt;                      &amp;quot;&amp;quot;,&lt;br /&gt;                      &amp;quot;\\1&amp;quot;, &lt;br /&gt;                      &amp;quot;\&amp;quot;&amp;quot;, &lt;br /&gt;                      &amp;quot;&amp;amp;&amp;quot;, &lt;br /&gt;                      &amp;quot;&amp;lt;&amp;quot;, &lt;br /&gt;                      &amp;quot;&amp;gt;&amp;quot;, &lt;br /&gt;                      &amp;quot; &amp;quot;, &lt;br /&gt;                      chr(161), &lt;br /&gt;                      chr(162), &lt;br /&gt;                      chr(163), &lt;br /&gt;                      chr(169), &lt;br /&gt;                      &amp;quot;chr(\\1)&amp;quot;); &lt;br /&gt;                      &lt;br /&gt;    return preg_replace($search, $replace, $htmlText);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;(В такие минуты как никогда радует возможность preg_replace работать с массивами в качестве параметров). Массив вы при необходимости дополняете своими регулярками. Помочь в их составлении вам может, например, этот &lt;a href=&quot;http://realcode.ru/regexptester/&quot;&gt;конструктор регулярных выражений&lt;/a&gt;. Начинающим разработчикам может быть полезной статья &lt;a href=&quot;http://www.pagecolumn.com/tool/all_about_html_tags.htm&quot; rel=&quot;nofollow&quot;&gt;&quot;All about HTML tags. 9 Regular Expressions to strip HTML tags&quot;&lt;/a&gt;. Посмотрите там примеры, проанализируйте логику.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;2. От объемов.&lt;/span&gt;&lt;br /&gt;Объемы напрямую связаны со сложностью анализа (из предыдущего пункта). Большое количество текстов увеличивает вероятность, что, пытаясь предусмотреть и почистить все регулярками, вы можете что-нибудь да упустить. В этом случае подойдет метод &quot;многоступенчатой&quot; очистки. То есть очистить сначала, допустим, функцией strip_tags_smart (исходники на всякий случай не удаляем). Потом выборочно просматриваем некоторое количество текстов на выявление &quot;аномалий&quot;. Ну и &quot;зачищаем&quot; аномалии регулярками.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;3. От того, что надо получить в результате.&lt;/span&gt;&lt;br /&gt;Алгоритм обработки может быть упрощен разными способами в зависимости от ситуации. Случай, описанный мной в &lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/06/wordpress-php-simple-html-dom-parser.html&quot;&gt;одной из предыдущих статей&lt;/a&gt;, хорошо это демонстрирует. Напомню, текст там находился в div-е, в котором кроме него был еще div с &quot;хлебными крошками&quot;, реклама адсенс, список похожих статей. При анализе выборки статей обнаружилось, что статьи не содержат рисунков и просто разбиты на абзацы с помощью &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;. Чтобы не чистить &quot;главный&quot; див от посторонних вещей, можно найти все абзацы (с Simple HTML DOM Parser это очень просто) и соединить их содержимое. Так что прежде чем составлять регулярки для чистки, посмотрите, нельзя ли обойтись малой кровью.&lt;br /&gt;&lt;br /&gt;Вообще, между сторонниками парсинга html-кода, основанного чисто на регулярных выражениях, и парсинга, в основе которого лежит анализ DOM-структуры документа, в сети разгораются настоящие холивары. Вот, например, на оверфлоу. Невинный с первого взгляда &lt;a href=&quot;http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/&quot; rel=&quot;nofollow&quot;&gt;вопрос&lt;/a&gt; вызвал очень бурное обсуждение (особенно обратите внимание на первый коммент, за который проголосовало уже более 3 тысяч человек, — чувак отжег :) ).&lt;br /&gt;В общем, каждый выбирает то, что ему ближе и что лучше подходит для конкретной ситуации.&lt;br /&gt;&lt;br /&gt;А какой способ предпочитаете вы?&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot;  rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.</description><link>http://parsing-and-i.blogspot.com/2010/06/html.html</link><author>noreply@blogger.com (Masha)</author><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-7143260105067710426</guid><pubDate>Wed, 23 Jun 2010 12:08:00 +0000</pubDate><atom:updated>2010-06-23T16:27:08.287+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Simple HTML DOM</category><title>3 способа установки User Agent при работе с библиотекой Simple HTML DOM Parser</title><description>Про &lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/06/user-agent.html&quot;&gt;юзерагенты&lt;/a&gt; на этом блоге я уже рассказывала. И говорила, что &quot;неподставление&quot; данных о User Agent-е в заголовок вашего запроса может выйти вам боком. Как подставить данные, если вы пользуетесь библиотекой &lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/05/php-simple-html-dom-parser.html&quot;&gt;Simple HTML DOM Parser&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Есть несколько очевидных способов.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Способ 1.&lt;/span&gt; &lt;span style=&quot;font-weight:bold;&quot;&gt;Используйте Simple HTML DOM Parser в связке с cURL.&lt;/span&gt;&lt;br /&gt;Самый простой способ. И для меня — самый удобный. Для установки юзерагента используйте параметр &lt;span style=&quot;font-style:italic;&quot;&gt;CURLOPT_USERAGENT&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ch = curl_init();&lt;br /&gt;curl_setopt($ch, CURLOPT_URL, $url);&lt;br /&gt;curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);&lt;br /&gt;curl_setopt($cr, CURLOPT_USERAGENT, &#39;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)&#39;);&lt;br /&gt;curl_setopt($ch, CURLOPT_TIMEOUT,5); &lt;br /&gt;curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);&lt;br /&gt;&lt;br /&gt;$html_curl = curl_exec($ch); &lt;br /&gt;curl_close($ch); &lt;br /&gt;&lt;br /&gt;$html = str_get_html($html_curl);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Способ 2.&lt;/span&gt; &lt;span style=&quot;font-weight:bold;&quot;&gt;Можете установить браузер по умолчанию в &lt;a href=&quot;http://www.php.net/manual/en/filesystem.configuration.php#ini.user-agent&quot; rel=&quot;nofollow&quot;&gt;php.ini&lt;/a&gt; или использовать ini_set().&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;pre&gt;ini_set(&quot;user_agent&quot;,&quot;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)&quot;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Тоже достаточно простой и удобный способ. Первый я в основном использую из-за того, что, как правило, приходится работать с cURL-ом (и с его возможностями) при загрузке страниц, поэтому мне удобнее установить User Agent именно там. Если бы курл был не нужен - использовала бы ini_set.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Способ 3.&lt;/span&gt; &lt;span style=&quot;font-weight:bold;&quot;&gt;Можете непосредственно внести изменения в функцию библиотеки load_file().&lt;/span&gt;&lt;br /&gt;Я сама этот способ не пробовала, но в архивах на всякий случай записан этот способ, взятый с стэковерфлоу.&lt;br /&gt;&lt;br /&gt;В исходном коде функция выглядит следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// load html from file&lt;br /&gt;function load_file() {&lt;br /&gt;  $args = func_get_args();&lt;br /&gt;  $this-&gt;load(call_user_func_array(&#39;file_get_contents&#39;, $args), true);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;А ее модификация может быть, например, такой:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// load html from file&lt;br /&gt;function load_file() {&lt;br /&gt;  $args = func_get_args();&lt;br /&gt;  // Added by Mithun&lt;br /&gt;  $opts = array(&lt;br /&gt;          &#39;http&#39;=&gt;array(&lt;br /&gt;                 &#39;method&#39;=&gt;&quot;GET&quot;,&lt;br /&gt;                 &#39;header&#39;=&gt;&quot;Accept-language: en\r\n&quot; .&lt;br /&gt;                 &quot;User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n&quot;.&lt;br /&gt;                 &quot;Cookie: foo=bar\r\n&quot;&lt;br /&gt;                )&lt;br /&gt;        );&lt;br /&gt;  $context = stream_context_create($opts);&lt;br /&gt;  $args[1] = FALSE;&lt;br /&gt;  $args[2] = $context;&lt;br /&gt;  // End Mithun&lt;br /&gt;  $this-&gt;load(call_user_func_array(&#39;file_get_contents&#39;, $args), true);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Еще раз напомню, для чего вам User Agent. Допустим, вы пишете парсер, краулер или бота. Некоторые вебмастеры в robots.txt запрещают доступ к материалам сайта, если в хэдэре запроса установлен User Agent, стандартный для библиотек, работающих с http (или информация о нем вообще отсутствует). Устанавливая User Agent, вы маскируете свой запрос так, словно он поступил от браузера.&lt;br /&gt;&lt;br /&gt;Но в любом случае надо знать меру. Если вы генерируете сотни запросов в минуту, то никакой юзерагент вас не прикроет :)&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot;  rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.</description><link>http://parsing-and-i.blogspot.com/2010/06/3-user-agent-simple-html-dom-parser.html</link><author>noreply@blogger.com (Masha)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-1895380938298802497</guid><pubDate>Tue, 15 Jun 2010 10:05:00 +0000</pubDate><atom:updated>2010-06-15T14:37:55.885+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Simple HTML DOM</category><category domain="http://www.blogger.com/atom/ns#">парсер</category><title>Разработка парсера каталога статей на движке WordPress с использованием PHP Simple HTML DOM Parser. Пошаговая инструкция</title><description>Всем доброго дня! Сегодня я опять отвечу на вопрос читателя блога. Вопрос был задан еще до объявления об Акции &amp;quot;Разобрать на моем примере&amp;quot;, тем не менее:&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;Маша, помогите пожалуйста спарсить http://articlet.com/, точнее расскажите что нужно делать пошагово.&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;Руководство по мере написания вылилось в достаточно длинную статью, но я решила не разбивать ее на части.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Изучение ресурса и разработка алгоритма&lt;/h2&gt;&lt;br&gt;&lt;br&gt;Итак, первое, что мы сделаем, — посмотрим, что из себя представляет ресурс. Это &lt;span style=&quot;font-weight:bold;&quot;&gt;каталог статей&lt;/span&gt;, сделанный на &lt;span style=&quot;font-weight:bold;&quot;&gt;WordPress&lt;/span&gt;. Структура рубрикатора — двухуровневая. То есть в корне находится несколько разделов, в каждом из которых могут находиться подразделы. Доступ к подразделам можно осуществить и с главной страницы и с внутренней страницы раздела. Нам, естественно, удобнее собрать все с главной.&lt;br&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpOqd0x6twwpHLJmObEdqlVqO8wQt2HCShyJ7hyphenhyphenNe8ETck9KBa0Pq9bvN9jeYzxOZ0UQmxjkl4fOLcoU1tSzt-UkHCKQ92QKIEl-uHP5E6m4S6WzKD5FzqTmo7t8VYsxCFejBxqSaAAvA/s1600/screen1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 291px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpOqd0x6twwpHLJmObEdqlVqO8wQt2HCShyJ7hyphenhyphenNe8ETck9KBa0Pq9bvN9jeYzxOZ0UQmxjkl4fOLcoU1tSzt-UkHCKQ92QKIEl-uHP5E6m4S6WzKD5FzqTmo7t8VYsxCFejBxqSaAAvA/s400/screen1.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5482940496535384258&quot;&gt;&lt;/a&gt;&lt;br&gt;Статьи могут находиться как в главных разделах, так и в подразделах.&lt;br&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHoFUYeFrjzmk8WbxIC6Q3hVz8WKmOCSfV77TSPBK7wEbCO961E2MsOAZjr-Y7h3koIOjWHeJHcqJsucLG06tPv9KqVJQKxMwG7tuS5vp-qqdwROwwDJtm3HQkBk3B55Jb8jAsPy6V8EE/s1600/screen2_subs.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 233px; height: 265px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHoFUYeFrjzmk8WbxIC6Q3hVz8WKmOCSfV77TSPBK7wEbCO961E2MsOAZjr-Y7h3koIOjWHeJHcqJsucLG06tPv9KqVJQKxMwG7tuS5vp-qqdwROwwDJtm3HQkBk3B55Jb8jAsPy6V8EE/s400/screen2_subs.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5482940499019065522&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/06/wordpress-php-simple-html-dom-parser.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2010/06/wordpress-php-simple-html-dom-parser.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpOqd0x6twwpHLJmObEdqlVqO8wQt2HCShyJ7hyphenhyphenNe8ETck9KBa0Pq9bvN9jeYzxOZ0UQmxjkl4fOLcoU1tSzt-UkHCKQ92QKIEl-uHP5E6m4S6WzKD5FzqTmo7t8VYsxCFejBxqSaAAvA/s72-c/screen1.png" height="72" width="72"/><thr:total>8</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-5048388165526054053</guid><pubDate>Thu, 10 Jun 2010 09:08:00 +0000</pubDate><atom:updated>2010-06-11T10:54:35.862+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">на примерах читателей</category><title>Delphi: пример поиска в структуре веб-страницы значения нужного элемента</title><description>&lt;div class=&quot;info&quot;&gt;Привет! Этот пост — ответ на вопрос читателя блога. Конкретный ответ на конкретный вопрос. Именно им я хочу положить начало &lt;span style=&quot;font-weight:bold;&quot;&gt;акции &amp;quot;Разберу на вашем примере&amp;quot;&lt;/span&gt;. Подробнее об акции и ее условиях читайте в конце этой статьи.&lt;/div&gt;&lt;br&gt;&lt;br&gt;Цитата из письма:&lt;blockquote&gt;&lt;br&gt;Мне нужно с сайта http://stock.rbc.ru/demo/micex.0/intraday/eod.rus.shtml скачать хоть одну ячейку например: цену открытия акций Газпрома, и сохранить это значение в какую-нибудь БД или таблицу (например в таблицу PARADOX7) или в EXCEL (лучше PARADOX7). И все, мне больше ничего не требуется, Ваша программа будет служить мне эталонным примером, а дальше я сам разберусь.&lt;br&gt;...&lt;br&gt;Я пытаюсь работать в среде С++Builder6 и пробовал использовать компонент XMLDocument, но кроме того как вытащить его на форму ничего не могу с ним сделать. Буду рад если вы напишите мне на С++Builder, но насколько я знаю, что С++Builder и DELPHI имеют множество сходств то и программе написанной на DELPHI буду благодарен...&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;Случай сложен тем, что, как мне кажется, если человек не программист, то ему исходный код на другом языке вряд ли поможет. А пример &amp;quot;сохранения в таблицу&amp;quot; не научит работе с базами данных. На скорую руку набросала поиск нужного элемента на странице, постаралась прокомментировать по-максимуму, так что дополнительно сказать нечего.&lt;br&gt;&lt;br&gt;Итак, код для поиска элемента:&lt;br&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/06/delphi.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2010/06/delphi.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2kKT2RcPxDE4ysLEEwDy2UdLpEB94bmRMlGf5daBMm-TanShD-mxcGqCzZcCaG3r8Rh11OBUtmEFaOoAhZUX-9vPoUeOFYemPuoGFaNmh0jCY6u-gjGDqypLAj143glwaY9jmvqHu3GA/s72-c/micex_rbc_screen.png" height="72" width="72"/><thr:total>13</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-8051117782601564093</guid><pubDate>Sun, 06 Jun 2010 10:49:00 +0000</pubDate><atom:updated>2010-06-10T21:05:22.662+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">web-автоматизация</category><category domain="http://www.blogger.com/atom/ns#">теория</category><title>User-Agent и идентификация. Взгляд с разных сторон</title><description>Думаю, что все, кто занимается программированием для web, знают, что такое &lt;span style=&quot;font-weight:bold;&quot;&gt;User-Agent&lt;/span&gt; и с чем его едят. Я решила немного обобщить знания и собрать их в одной статье. Сначала определение (&lt;a href=&quot;http://ru.wikipedia.org/wiki/User_Agent&quot; rel=&quot;nofollow&quot;&gt;Википедия в помощь&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;User Agent&lt;/span&gt; — это клиентское приложение, использующее определённый сетевой протокол. Термин обычно используется для приложений, осуществляющих доступ к веб-сайтам, таким как браузеры, поисковые роботы (и другие «пауки»), мобильные телефоны и другие устройства.&lt;br /&gt;При посещении веб-сайта клиентское приложение обычно посылает веб-серверу информацию о себе. Это текстовая строка, являющаяся частью HTTP запроса, начинающаяся с User-agent: или User-Agent:, и обычно включающая такую информацию, как название и версию приложения, операционную систему компьютера и язык. У «пауков» эта строка часто содержит URL и email-адрес, по которым веб-мастер может связаться с оператором «паука».&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;User-Agent и вебмастер&lt;/h2&gt;&lt;br /&gt;Что дает вебмастеру и оптимизатору знание о таком понятии как User-Agent? Если знать названия поисковых роботов (и роботов различных ресурсов, краулеров и т.д.), то можно самостоятельно регламентировать доступ этих роботов к различным частям сайта. Это делается в небезызвестном файле &lt;span style=&quot;font-weight:bold;&quot;&gt;robots.txt&lt;/span&gt;, который должен находиться в корневой папке сайта.&lt;br /&gt;&lt;br /&gt;Вот как описан механизм работы робота Яндекса в зависимости от настроек в robots.txt (&lt;a href=&quot;http://help.yandex.ru/webmaster/?id=996567&quot; rel=&quot;nofollow&quot;&gt;полная версия мануала по использованию robots.txt&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;В роботе Яндекса используется сессионный принцип работы, на каждую сессию формируется определенный пул страниц, которые планирует закачать робот. Сессия начинается с закачки robots.txt сайта, если его нет, он не текстовый или на запрос робота возвращается HTTP-код отличный от &#39;200&#39;, считается, что доступ роботу не ограничен. В самом robots.txt проверяется наличие записей, начинающихся с &#39;User-agent:&#39;, в них ищутся подстроки &#39;Yandex&#39;, либо &#39;*&#39; (регистр значения не имеет), причем, если обнаружено &#39;User-agent: Yandex&#39;, директивы для &#39;User-agent: *&#39; не учитываются. Если записи &#39;User-agent: Yandex&#39; и &#39;User-agent: *&#39; отсутствуют, считается, что доступ роботу не ограничен.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Итак, для &quot;управления&quot; зоной видимости определенного робота надо добавить в robots.txt несколько строк. &quot;Распознаются&quot; директивы &lt;span style=&quot;font-weight:bold;&quot;&gt;Allow&lt;/span&gt; и &lt;span style=&quot;font-weight:bold;&quot;&gt;Disallow&lt;/span&gt;, соответственно разрешающие и запрещающие доступ роботу/краулеру/и т.д. к определенным частям вашего ресурса.&lt;br /&gt;&lt;br /&gt;Списки названий роботов поисковиков открыты, их можно без проблем найти в интернете. Вот, например, совсем недавно, буквально месяц назад (6 мая 2010 года), на блоге Яндеска был опубликован свеженький &lt;a href=&quot;http://webmaster.ya.ru/replies.xml?item_no=7783&amp;ncrnd=1247&quot; rel=&quot;nofollow&quot;&gt;список User-Agent-ов его роботов&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Итак, вы можете редактировать robots.txt, чтобы запретить или разрешить доступ определенных роботов к разным частям сайта. Рассмотрим конкретный случай: у Гугля есть новостной робот, но архивы вашего сайта не нуждаются в полном обходе этим роботом, поэтому пишем:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;User-agent: Googlebot-News&lt;br /&gt;Disallow: /archives&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Если у вас чисто новостной сайт, вы можете захотеть запретить индексацию всего сайта всеми роботами Гугля кроме новостного. Тогда вам понадобится уже две группы директив:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;User-agent: Googlebot&lt;br /&gt;Disallow: /&lt;br /&gt;&lt;br /&gt;User-agent: Googlebot-News&lt;br /&gt;Disallow:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Первая группа определит правило для всех гуглеботов, а вторая изменит установленные ранее правила конкретно для Googlebot-News.&lt;br /&gt;&lt;br /&gt;Помимо роботов поисковых систем по сети шарят множество всяких краулеров, собирающих контент для разных нужд. В буржунете их наблюдается больше, по крайней мере больше жалоб :) Краулеры могут поднимать нагрузки на ваш сервак на нежелательный уровень. А &quot;палятся&quot; некоторые из них, как вы уже, наверное, догадались, своими User-Agent-ами. В буржунете я не раз встречала целые списки юзерагентов для блокировки, выложенные в паблик. При желании вы можете их найти. Например: &lt;a href=&quot;http://johannburkard.de/blog/www/spam/The-top-10-spam-bot-user-agents-you-MUST-block-NOW.html&quot; rel=&quot;nofollow&quot;&gt;The top 10 spam bot user agents you MUST block. NOW.&lt;/a&gt; (&quot;Десять User-agent-ов спам-ботов, которые вы ДОЛЖНЫ заблокировать. НЕМЕДЛЕННО.&quot;) Или, как вариант, можете посмотреть сайт &lt;a href=&quot;http://www.botsvsbrowsers.com/&quot; rel=&quot;nofollow&quot;&gt;Bots vs Browsers&lt;/a&gt;, на котором в момент написания статьи собрана информация о 499551 юзерагентах, из которых ботов - 4439. Или уже известный многим сайт www.user-agents.org.&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; width: 400px; height: 26px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYx7KPZLry1jNXAVHPpQfZLE-ZOgqJggsYOA0XMjYJQbPbY_L_sAqCcloG4L89VGhYZnbwAgIS8v9T7KQU8YUNAapHhtyj4s9woghZZHp88IGB4rVkCwy9fYcBe10jaamsmPxAN_syM30/s400/logo.png&quot; border=&quot;0&quot; alt=&quot;User-Agents vs browsers&quot;id=&quot;BLOGGER_PHOTO_ID_5479676817207496242&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Информацию о юзерагентах ваших &quot;посетителей&quot; вы можете посмотреть в лог-файле статистики. Если увидите что-нибудь подозрительное — уже знаете, как поступить :)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;info&quot;&gt;Отмечу также, что для каждого движка есть отдельные наборы рекомендаций к правилам составления robots.txt для роботов поисковых систем. Прежде чем самостоятельно придумывать конфигурацию, поищите в Интернете.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;User-Agent и программист парсеров :)&lt;/h2&gt;&lt;br /&gt;Постоянные читатели, наверное, в недоумении: чего это я распространяюсь о том, как защититься от ботов? Для вновь прибывших повторюсь: я сама против воровства контента и его несанкционированного использования. Но целями парсинга может быть всякое (тут уж каждому по способностям).&lt;br /&gt;&lt;br /&gt;Итак, рассмотрю вопрос применения знаний о User-Agent-ах со стороны создателя парсеров. Все более-менее серьезные библиотеки работы с HTTP поддерживают возможность подстановки в заголовки формируемых запросов &quot;левой&quot; информации о браузере. Не забудьте поменять установленные по умолчанию значения на что-нибудь более правдоподобное. (Отсутствие информации о браузере подозрительно в первую очередь). У Indy, например, по умолчанию стоит&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Mozilla/3.0 (compatible; Indy Library)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ну как тут не спалиться? Это первый претендент на добавление в black-list.&lt;br /&gt;&lt;br /&gt;libwww, lwp-trivial, curl, PHP/, urllib, GT::WWW, Snoopy, MFC_Tear_Sample, HTTP::Lite, PHPCrawl, URI::Fetch, Zend_Http_Client, http client, PECL::HTTP — все это может вас выдать с головой.&lt;br /&gt;&lt;br /&gt;Самый простой способ, это создать файлик со всевозможными браузерами, а потом при организации запроса подставлять рандомно одну из записей. Ресурсов с базами подходящих User-Agent-ов - масса, ссылки на них я приводила в первой части статьи.&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href=&quot;http://feeds2.feedburner.com/parsing-lessons&quot;  rel=&quot;nofollow&quot;&gt;подписаться на RSS&lt;/a&gt;.</description><link>http://parsing-and-i.blogspot.com/2010/06/user-agent.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYx7KPZLry1jNXAVHPpQfZLE-ZOgqJggsYOA0XMjYJQbPbY_L_sAqCcloG4L89VGhYZnbwAgIS8v9T7KQU8YUNAapHhtyj4s9woghZZHp88IGB4rVkCwy9fYcBe10jaamsmPxAN_syM30/s72-c/logo.png" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-2506355526452731097</guid><pubDate>Mon, 31 May 2010 09:41:00 +0000</pubDate><atom:updated>2010-06-11T10:54:52.637+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">csv</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><title>PHP: построчное чтение и обработка больших CSV-файлов</title><description>С &lt;span style=&quot;font-weight:bold;&quot;&gt;проблемой обработки больших CSV-файлов на PHP&lt;/span&gt; в первый раз я столкнулась недавно. На PHP я вообще мало программирую, только если возникают задачи написать что-либо конкретно на этом языке.&lt;br&gt;&lt;br&gt;В предыдущей статье были рассмотрены &lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/05/csv-mysql.html&quot;&gt;разные варианты импорта CSV-файла в базу данных MySQL&lt;/a&gt;. Там же я отметила, что работа с большими файлами требует особого подхода. Основным ограничением для импорта большого объема данных является время выполнения скрипта, которое задается хостером (как правило 30 секунд).&lt;br&gt;&lt;br&gt;Мне необходимо было именно автоматизировать процесс полного импорта. Перед вставкой в таблицу значения полей, полученные из scv-файла, требовали анализа и дополнительной обработки.&lt;br&gt;&lt;br&gt;Когда я прочитала в описании утилиты &lt;span style=&quot;font-weight:bold;&quot;&gt;BigDump&lt;/span&gt; (в предыдущей статье я на нее ссылалась) о принципе работы:&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;The script executes only a small part of the huge dump and restarts itself. The next session starts where the last was stopped. (&lt;span style=&quot;font-weight:bold;&quot;&gt;Перевод:&lt;/span&gt; Скрипт выполняет лишь небольшую часть SQL-команд из файла и перезапускает сам себя. В следующий раз импорт начинается с того места, в котором скрипт прервал свою работу.)&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;я поняла, что мне обязательно нужно попробовать такое решение. Поиски в инете чего-то похожего окончились успешно.&lt;br&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/05/php-csv.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2010/05/php-csv.html</link><author>noreply@blogger.com (Masha)</author><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-3666931776561364106</guid><pubDate>Thu, 27 May 2010 11:58:00 +0000</pubDate><atom:updated>2010-07-07T20:11:12.401+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">csv</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><title>Запись данных из CSV-файлов в базу MySQL</title><description>Это вопрос из категории &amp;quot;для начинающих&amp;quot;. Но тем не менее я решила его осветить на страницах блога, в угоду желанию объять необъятное и получить с поисковиков дополнительный трафик. :)&lt;br&gt;&lt;br&gt;Итак, у вас есть CSV-файл, и перед вами встала задача записать содержимое этого файла в базу.&lt;br&gt;&lt;br&gt;&lt;H2&gt;Импорт CSV-файла через PHPMyAdmin&lt;/H2&gt;&lt;br&gt;Первый и самый простой способ — воспользоваться готовым инструментом. Например, функция импорта данных из csv-файла в базу есть в &lt;span style=&quot;font-weight:bold;&quot;&gt;PHPMyAdmin&lt;/span&gt;-е.&lt;br&gt;&lt;br&gt;Выбираем нужную таблицу, на вкладке &amp;quot;Структура&amp;quot; внизу нажимаем на &amp;quot;&lt;span style=&quot;font-style:italic;&quot;&gt;Вставить текстовые файлы в таблицу&lt;/span&gt;&amp;quot;. Указаваем настройки импорта.&lt;br&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpYufTQq5iwLjfQTYW7-Rloh5eGVKD7VsZ228xzf6vOqM8ZzRq3J39eYUHkxGWP3CM12KgnFxFwz1RMUSWzhzQaO10t-5ks5kmLGe5VhdA483xc9sUSKg8K9k6z6sbOUvdx5ZQKdHLxY/s1600/import_link.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 298px; height: 31px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpYufTQq5iwLjfQTYW7-Rloh5eGVKD7VsZ228xzf6vOqM8ZzRq3J39eYUHkxGWP3CM12KgnFxFwz1RMUSWzhzQaO10t-5ks5kmLGe5VhdA483xc9sUSKg8K9k6z6sbOUvdx5ZQKdHLxY/s400/import_link.gif&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5475919015365970098&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjJgM1sRjvviExYAFttpxeuLExU1kmsHIyRMq33-swzMsFG-cvhTGfcgy70AaoOK_f8rnrV8Do0xrzdxKWC0aBKmtSW6Vf0F9hKnPBvKBtNJvPthdGxUtzaAdGfEEcreITQcJ8tGUnyWs/s1600/import_options_phpmyadmin.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 277px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjJgM1sRjvviExYAFttpxeuLExU1kmsHIyRMq33-swzMsFG-cvhTGfcgy70AaoOK_f8rnrV8Do0xrzdxKWC0aBKmtSW6Vf0F9hKnPBvKBtNJvPthdGxUtzaAdGfEEcreITQcJ8tGUnyWs/s400/import_options_phpmyadmin.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5475919018730528594&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Внимание! Если после нажатия &amp;quot;Выполнить&amp;quot; у вас вылезли ошибки типа&lt;br&gt;&lt;br&gt;&lt;div class=&quot;error&quot;&gt;ldi_check.php: Missing parameter: db&lt;br&gt;ldi_check.php: Missing parameter: table&lt;/div&gt;&lt;br&gt;&lt;br&gt;это может объясняться разными причинами.&lt;br&gt;&lt;br&gt;1. Возможно, &lt;span style=&quot;font-weight:bold;&quot;&gt;файл, предназначенный для импорта, слишком большой&lt;/span&gt;. В старых версиях PHPMyAdmin (младше 2.7.0) был баг с импортом больших файлов. Так что, возможно, выходом из ситуации будет обновление PHPMyAdmin-а.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;info&quot;&gt;(Ссылка на &lt;a href=&quot;http://www.phpmyadmin.net/documentation/Documentation.html#faq1_16&quot; rel=&quot;nofollow&quot;&gt;пункт 1.16 FAQ&lt;/a&gt;) Начиная с версии 2.7.0 функция импорта была переписана и проблем с импортом больших файлов не должно возникать.&lt;br&gt;&lt;br&gt;Следующее, что можно проверить (или спросить у провайдера), - это значения параметров &lt;span style=&quot;font-weight:bold;&quot;&gt;upload_max_filesize&lt;/span&gt;, &lt;span style=&quot;font-weight:bold;&quot;&gt;memory_limit&lt;/span&gt; и &lt;span style=&quot;font-weight:bold;&quot;&gt;post_max_size&lt;/span&gt; в конфигурационном файле &lt;span style=&quot;font-weight:bold;&quot;&gt;php.ini&lt;/span&gt;. Эти три настройки ограничивают максимальный размер данных, которые могут быть переданы и обработаны PHP.&lt;/div&gt;&lt;br&gt;&lt;br&gt;Там же, в документации, приводится описание нескольких &amp;quot;обходных путей&amp;quot;, которые подойдут, если вы импортируете не scv-файл, а заливаете дамп базы, а ваш провайдер не хочет менять настройки:&lt;br&gt;&lt;br&gt;а) Проверьте настройку &lt;a href=&quot;http://www.phpmyadmin.net/documentation/Documentation.html#cfg_UploadDir&quot; rel=&quot;nofollow&quot;&gt;$cfg[&amp;#39;UploadDir&amp;#39;]&lt;/a&gt;. Она позволяет настроить загрузку файла на сервер через scp, ftp или другим методом. PhpMyAdmin может работать с файлами, расположенными во временном каталоге. Более подробную информацию читайте в разделе &lt;a href=&quot;http://www.phpmyadmin.net/documentation/Documentation.html#config&quot; rel=&quot;nofollow&quot;&gt;Настройки&lt;/a&gt; документации.&lt;br&gt;&lt;br&gt;б) Используйте сторонние утилиты (например, &lt;a href=&quot;http://www.ozerov.de/bigdump.php&quot; rel=&quot;nofollow&quot;&gt;BigDump&lt;/a&gt;) для того, чтобы разбить файл перед загрузкой.&lt;br&gt;&lt;br&gt;в) Если у вас есть прямой shell доступ, используйте MySQL для импорта файлов напрямую. Вы можете это сделать с помощью команды &amp;quot;source&amp;quot;:&lt;br&gt;&lt;pre&gt;source filename.sql&lt;/pre&gt;&lt;br&gt;2. Если файл небольшой, но эти ошибки все же появляются, то вам может помочь вот эта &lt;a href=&quot;http://www.webmasterworld.com/forum88/8393.htm&quot; rel=&quot;nofollow&quot;&gt;тема на форуме&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;H2&gt;Парсинг CSV-файла с помощью PHP&lt;/H2&gt;&lt;br&gt;Далее — программные способы. Они подойдут вам, если вы хотите все это дело автоматизировать или если перед непосредственной вставкой вам нужно провести дополнительную обработку данных.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;warning&quot;&gt;Если вы предполагаете работать с большими файлами, то так просто описанные ниже способы вам тоже могут не подойти. Вам нужно будет провести на подготовительном этапе действия, описанные в пункте об импорте больших файлов через PHPMyAdmin.&lt;/div&gt;&lt;br&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/05/csv-mysql.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2010/05/csv-mysql.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpYufTQq5iwLjfQTYW7-Rloh5eGVKD7VsZ228xzf6vOqM8ZzRq3J39eYUHkxGWP3CM12KgnFxFwz1RMUSWzhzQaO10t-5ks5kmLGe5VhdA483xc9sUSKg8K9k6z6sbOUvdx5ZQKdHLxY/s72-c/import_link.gif" height="72" width="72"/><thr:total>12</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-5318457579382402695</guid><pubDate>Thu, 20 May 2010 13:00:00 +0000</pubDate><atom:updated>2010-06-11T10:55:42.271+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Simple HTML DOM</category><title>PHP Simple HTML DOM Parser</title><description>Сегодня я немного расскажу про библиотеку для парсинга HTML под названием &lt;span style=&quot;font-weight:bold;&quot;&gt;PHP Simple HTML DOM Parser&lt;/span&gt;. В последнее время частенько ей пользовалась: нравятся ее возможности и простота. Скачать библиотеку можно со &lt;a href=&quot;http://sourceforge.net/projects/simplehtmldom/files/&quot; rel=&quot;nofollow&quot;&gt;страницы&lt;/a&gt;. В комментарии к сказано:&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;A simple PHP HTML DOM parser written in PHP5+, supports invalid HTML, and provides a very easy way to handle HTML elements.&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;То есть нам обещают массу плюсов, основные из которых скорость и поддержка невалидного html-кода. Изучив &lt;a href=&quot;http://simplehtmldom.sourceforge.net/manual.htm&quot; rel=&quot;nofollow&quot;&gt;документацию&lt;/a&gt;, можно вдохновиться на подвиги: возможности библиотеки действительно впечатляют. Кроме всего прочего - удобный, интуитивно понятный синтаксис.&lt;br&gt;&lt;br&gt;Еще в числе плюсов, которые я отметила, — отсутствие проблем с кодировками. Часто бывает, что, получив содержимое страницы с помощью, например, file_get_contents, кодировку данных на промежуточном этапе приходится преобразовывать. Здесь же такой надобности у меня пока что не возникало.&lt;br&gt;&lt;br&gt;С помощью этой библиотеки вы можете обращаться к элементам и атрибутам элементов, искать определенного уровня вложенные элементы, фильтровать их, искать текст и комментарии(!).&lt;br&gt;&lt;br&gt;Приведу примеры из документации:&lt;br&gt;&lt;br&gt;&lt;pre&gt;// Найти ссылки и возвратить массив найденных объектов&lt;br&gt;$ret = $html-&gt;find(&amp;#39;a&amp;#39;);&lt;br&gt;&lt;br&gt;// Найти (N)-ую по счету ссылку и возвратить найденный объект или null в случае, если объект не найден&lt;br&gt;$ret = $html-&gt;find(&amp;#39;a&amp;#39;, 0);&lt;br&gt;&lt;br&gt;// Найти все элементы &amp;lt;div&amp;gt;, у которых id=foo&lt;br&gt;$ret = $html-&gt;find(&amp;#39;div[id=foo]&amp;#39;); &lt;br&gt;&lt;br&gt;// Найти все элементы &amp;lt;div&amp;gt;, имеющие атрибут id&lt;br&gt;$ret = $html-&gt;find(&amp;#39;div[id]&amp;#39;);&lt;br&gt;&lt;br&gt;// Найти все элементы, имеющие атрибут id&lt;br&gt;$ret = $html-&gt;find(&amp;#39;[id]&amp;#39;);&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Ну и, конечно, стандарто - в библиотеку заложена возможность перемещения по списку элементов объектного дерева. Для этого используются:&lt;br&gt;&lt;pre&gt;$e-&gt;children( [int $index] ), &lt;br&gt;$e-&gt;parent(), &lt;br&gt;$e-&gt;first_child(), &lt;br&gt;$e-&gt;last_child(),&lt;br&gt;$e-&gt;next_sibling(), &lt;br&gt;$e-&gt;prev_sibling().&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Прежде чем на страницах этого блога приводить примеры парсеров, написанных с использованием этой библиотеки, я решила протестировать, насколько соответствует реальности обещанное быстродействие. Явных тормозов я за ней не замечала, но хотелось бы получить доказательство в цифрах.&lt;br&gt;&lt;a href=&quot;http://parsing-and-i.blogspot.com/2010/05/php-simple-html-dom-parser.html#more&quot;&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;</description><link>http://parsing-and-i.blogspot.com/2010/05/php-simple-html-dom-parser.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvGW4b94zMzSatI9CWgk38rUxia06rsoM58_xPc7IwQpwehPJ-MgCAjmnK2A5F-Bim1MdUu5vcND7-pznPcchpGBEqbhoM4yQu_ppC-jrRWVMudwPNfDJ5w__esr-IfW5VHlmUdhAQsvE/s72-c/res_simple_dom.png" height="72" width="72"/><thr:total>27</thr:total></item></channel></rss>