<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" 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>Thu, 23 May 2013 11:29:24 +0000</lastBuildDate><category>linux</category><category>Яндекс</category><category>tools</category><category>парсинг Яндекса</category><category>теория</category><category>опупеть</category><category>CURL</category><category>Curlpas</category><category>TTreeView</category><category>разработка</category><category>TChromium</category><category>парсинг</category><category>парсинг выдачи поисковиков</category><category>TWebBrowser</category><category>БД</category><category>Synapse</category><category>XML</category><category>Indy</category><category>узкие места</category><category>парсер</category><category>на примерах читателей</category><category>отладка</category><category>форумы</category><category>PHP</category><category>coHTMLDocument</category><category>web-автоматизация</category><category>RSS</category><category>UrlDownloadToFile</category><category>IHTMLDocument2</category><category>RegExp</category><category>способы применения парсинга</category><category>компоненты и библиотеки Delphi</category><category>базы</category><category>XMLDocument</category><category>Delphi</category><category>объектная модель</category><category>алгоритмы</category><category>блог</category><category>RSSAdder</category><category>код</category><category>csv</category><category>регулярные выражения</category><category>парсинг Google</category><category>IdHTTP</category><category>Simple HTML DOM</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>109</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/parsing-lessons" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="parsing-lessons" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">parsing-lessons</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><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="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-uVXW2gE3bDc/USUvHAXzwXI/AAAAAAAAAWM/BneEtFPzNLo/s1600/vk-login-form.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-uVXW2gE3bDc/USUvHAXzwXI/AAAAAAAAAWM/BneEtFPzNLo/s1600/vk-login-form.png" /&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 := 'document.forms[0].quick_email.value="UserEmail";';
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
      CodeStr := 'document.forms[0].quick_pass.value="UserPass";';
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
      CodeStr := 'document.forms[0].submit();';
      Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
    end;
end;&lt;/pre&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&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="http://feeds2.feedburner.com/parsing-lessons" rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/c4gkcCjZ9bw" height="1" width="1"/&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="http://3.bp.blogspot.com/-uVXW2gE3bDc/USUvHAXzwXI/AAAAAAAAAWM/BneEtFPzNLo/s72-c/vk-login-form.png" height="72" width="72" /><thr:total>6</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="ltr" style="text-align: left;" trbidi="on"&gt;
В комментариях к статье &lt;a href="http://parsing-and-i.blogspot.com/2013/01/tchromium-cookies-in-delphi.html"&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="http://parsing-and-i.blogspot.com/2013/02/how-to-clear-cookies-in-TChromium.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/bufAqnhTfM4" height="1" width="1"/&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>9</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="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="text-align: left;"&gt;
Для тех, кто случайно наткнулся на эту статью. Я хочу провести эксперимент с продвижением в социальной сети VK.com, используя автоматизацию. Для этого я пишу (пусть и очень медленно, в свободное время) свое приложение и частично освещаю ход работ на этом блоге.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
В предыдущей серии я рассказала про &lt;a href="http://parsing-and-i.blogspot.com/2013/01/tchromium-cookies-in-delphi.html" target="_blank"&gt;компонент для браузера&lt;/a&gt;, который буду использовать. Настало время определиться с данными.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
Сначала хотела вообще обойтись без БД, а заодним и описать работу с XML, но, подумав, решила, что без базы будет сложно (и неудобно, если пользователей заведется много). Особенно, если разрабатывать с перспективами. Поэтому сегодня речь пойдет о &lt;b&gt;SQLite&lt;/b&gt;.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
Чем руководствовалась при выборе БД?&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Максимальная простота и легкость.&lt;/li&gt;
&lt;li&gt;Минимум телодвижений для работы приложения на другой машине: надо просто скопировать все содержимое папки к себе (кроме файлов БД нужна только dll).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;
&lt;/ul&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;/h3&gt;&lt;/div&gt;&lt;a href="http://parsing-and-i.blogspot.com/2013/01/sqlite-delphi-7-disqlite.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/_PkJI_rwFrY" height="1" width="1"/&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="http://1.bp.blogspot.com/-K2F2khadFe4/UPmdeYvPT2I/AAAAAAAAAVs/OnbIyKCLSUE/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 без постоянного "перелогинивания". В Webbrowser-е это можно организовать только шаманскими методами, а вот в Chromium-e решение выглядит очень красиво и просто.&lt;br /&gt;
&lt;h3&gt;
Установка DCEF3 в Delphi7 (компонент TChromium)&lt;/h3&gt;
&lt;div&gt;
На Googlecode можно найти 2 версии: старую (&lt;a href="http://code.google.com/p/delphichromiumembedded/"&gt;http://code.google.com/p/delphichromiumembedded/&lt;/a&gt;) и поновее (&lt;a href="http://code.google.com/p/dcef3/"&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, выбираем через "Open" пакет для 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 = 'Cookies/';
...
procedure TForm1.Button1Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
  CookiesPath  : String;
begin
  CookiesPath := ExtractFilePath(Application.ExeName) + DefaultCookiesDir + 'User1';
  CookieManager := TCefCookieManagerRef.Global;
  CookieManager.SetStoragePath(CookiesPath);
  Chromium1.Load('vk.com');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
  CookiesPath  : String;
begin
  CookiesPath := ExtractFilePath(Application.ExeName) + DefaultCookiesDir + 'User2';
  CookieManager := TCefCookieManagerRef.Global;
  CookieManager.SetStoragePath(CookiesPath);
  Chromium1.Load('vk.com');
end;
&lt;/pre&gt;
&lt;br /&gt;
Не ждите, что это уже получилось супер-приложение :) Я просто привожу пример, как для TChromium можно с легкостью переключать папки, в которых браузер хранит кукисы.&lt;br /&gt;
&lt;br /&gt;
Нажимаем на первую кнопку, логинимся:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-4vQ0XeM2-7A/UPROleu6X8I/AAAAAAAAAVU/Ocra99vfa1U/s1600/user1-chromium.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-4vQ0XeM2-7A/UPROleu6X8I/AAAAAAAAAVU/Ocra99vfa1U/s1600/user1-chromium.png" height="171" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
Нажимаем на вторую кнопку. Второй раз браузер будет использовать совсем другие кукисы, поэтому загружается главная страница.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Pry4oaFiJWg/UPROlAzorMI/AAAAAAAAAVY/452ZHGL75MA/s1600/user2-chromium.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Pry4oaFiJWg/UPROlAzorMI/AAAAAAAAAVY/452ZHGL75MA/s1600/user2-chromium.png" height="171" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
При этом автоматически создаются подкаталоги в папке &lt;i&gt;Cookies&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-mQmMtvOAh6I/UPMg3R3owDI/AAAAAAAAAU8/ND5btGcHyHg/s1600/cookies-path.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-mQmMtvOAh6I/UPMg3R3owDI/AAAAAAAAAU8/ND5btGcHyHg/s1600/cookies-path.png" /&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="http://feeds2.feedburner.com/parsing-lessons" rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/lFFgZRKR-gw" height="1" width="1"/&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="http://4.bp.blogspot.com/-4vQ0XeM2-7A/UPROleu6X8I/AAAAAAAAAVU/Ocra99vfa1U/s72-c/user1-chromium.png" height="72" width="72" /><thr:total>14</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="tr_bq"&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;
Всем вебмастерам, кто только начинает заниматься своими проектами, хочется найти заветную кнопку "Бабло". Кнопки такой не существует, но есть масса способов, которые могут сработать и принести хоть какую-никакую, но прибыль.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Скажу честно, я читала о всяких вариантах, но никогда их не пробовала реализовывать — всегда находились дела поважнее и, как большинство фрилансеров, испытывала нехватку свободного времени. Но сейчас решила немного себя перебороть и сделать что-нибудь "новенькое" для себя. Конечно же, нехватка времени в настоящий момент тоже остро стоит, но что делать...&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 хочу создать какой-нибудь сайт из разряда "сделал и забыл" или хотя бы "сделал и подзабыл".&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="http://feeds2.feedburner.com/parsing-lessons" rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;. :)&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/vMB3anIx_9M" height="1" width="1"/&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="http://parsing-and-i.blogspot.com/2012/12/happy-new-year.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/dVJb98U_In4" height="1" width="1"/&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="http://parsing-and-i.blogspot.com/2009/06/cookies-twebbrowser.html"&gt;cookies в TWebBrowser&lt;/a&gt;, как их удалять. В гугле, ясно дело, решение найти просто, но почему-то для кого-то проще спросить и ждать :)&lt;br /&gt;&lt;br /&gt;В общем, если на мой блог о парсинге приходят по этому запросу, то надо на него ответить. :)&lt;br /&gt;&lt;br /&gt;Это готовое решение, взятое из инета и опробованное мной. В результате будут подчищены все файлы с куками, хранящиеся в &lt;span style="font-style:italic;"&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="font-weight:bold;"&gt;Для чего может пригодиться очистка кукисов?&lt;/span&gt; Ну, например, вы написали какое-то свое приложение с TWebBrowser и заходите на определенный сайт через список прокси... ;)&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Сегодня объявляю гранд мерси &lt;span style="font-weight:bold;"&gt;akkadites&lt;/span&gt;, автору блога &lt;a href="http://u-proga.co.cc/"&gt;"Обзор полезного софта"&lt;/a&gt;, и &lt;a href="http://seorit.ru/"&gt;Seorit.ru&lt;/a&gt; за обзоры &lt;a href="http://parsing-and-i.blogspot.com/2009/08/rssadder-rss-rss.html"&gt;RSSAdder&lt;/a&gt;-а.&lt;br /&gt;___&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href="http://feeds2.feedburner.com/parsing-lessons"  rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/q0GjnWA63kI" height="1" width="1"/&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="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-epUoQTFFqQ0/TWeJNZrpDoI/AAAAAAAAAUc/RzJ5mFZ-aCY/s1600/delphi-xe.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 105px; height: 99px;" src="http://4.bp.blogspot.com/-epUoQTFFqQ0/TWeJNZrpDoI/AAAAAAAAAUc/RzJ5mFZ-aCY/s400/delphi-xe.gif" border="0" alt="Delphi XE" id="BLOGGER_PHOTO_ID_5577577526846885506" /&gt;&lt;/a&gt;Только ленивый программист-блоггер не написал еще об этой акции, проводимой Embarcadero. Продукт &lt;a href="http://www.embarcadero.com/products/delphi/starter"&gt;Delphi XE Starter Edition&lt;/a&gt; можно купить за 199 баксов (или за 5900 рублей — &lt;a href="http://ibase.ru/prices/embarcadero.htm"&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="http://feeds2.feedburner.com/parsing-lessons"  rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/_i6hdtoEyIw" height="1" width="1"/&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="http://4.bp.blogspot.com/-epUoQTFFqQ0/TWeJNZrpDoI/AAAAAAAAAUc/RzJ5mFZ-aCY/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="http://parsing-and-i.blogspot.com/2010/12/delphi-tlist.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/y1TnygGVHEM" height="1" width="1"/&gt;</description><link>http://parsing-and-i.blogspot.com/2010/12/delphi-tlist.html</link><author>noreply@blogger.com (Masha)</author><thr:total>8</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#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">Curlpas</category><category domain="http://www.blogger.com/atom/ns#">CURL</category><title>Delphi: работа с cURL с помощью библиотеки-обертки Curlpas</title><description>&lt;a href="http://parsing-and-i.blogspot.com/2009/03/internet-direct-indy.html" title="Знакомство с Indy"&gt;Indy&lt;/a&gt; и &lt;a href="http://parsing-and-i.blogspot.com/2010/02/synapse-in-delphi-first-steps.html" title="Знакомство с Synapse"&gt;Synapse&lt;/a&gt; вам надоели? Самое время попробовать что-нибудь новенькое :)&lt;br /&gt;&lt;br /&gt;Если кто-нибудь, начитавшись статей про &lt;a href="http://parsing-and-i.blogspot.com/2009/09/curl-first-steps.html" title="Начало работы с cURL в PHP"&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="http://curl.haxx.se/download.html" rel="nofollow" title="Исходники libcurl"&gt;ссылке&lt;/a&gt;. Из всего разнообразия выбираем те, что подходят для нашей операционки. В моем случае это:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dS8cdXcqCug/TOGgNsTd88I/AAAAAAAAASo/__Pn1WL2yYo/s1600/win_lib_download.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 70px;" src="http://3.bp.blogspot.com/_dS8cdXcqCug/TOGgNsTd88I/AAAAAAAAASo/__Pn1WL2yYo/s400/win_lib_download.gif" border="0" alt="libcurl для Windows" title="libcurl для Windows" id="BLOGGER_PHOTO_ID_5539885173733979074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Содержимое папки &lt;span style="font-weight:bold;"&gt;bin&lt;/span&gt; из скачанного архива копируем в &lt;span style="font-style:italic;"&gt;C:\WINDOWS\system32\&lt;/span&gt;. Там несколько файлов dll:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dS8cdXcqCug/TOGgsrP7lwI/AAAAAAAAASw/1z56j1bYDWQ/s1600/curl_lib_files.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 190px; height: 151px;" src="http://1.bp.blogspot.com/_dS8cdXcqCug/TOGgsrP7lwI/AAAAAAAAASw/1z56j1bYDWQ/s400/curl_lib_files.gif" border="0" alt="Файлы библиотеки libcurl" id="BLOGGER_PHOTO_ID_5539885706026653442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Скачиваем готовую библиотеку-обертку &lt;a href="http://sourceforge.net/projects/curlpas/files/" rel="nofollow" title="Библиотека для работы с CURL в Delphi — CurlPas"&gt;CurlPas&lt;/a&gt; для работы с libcurl.&lt;br /&gt;&lt;br /&gt;3. Распаковываем архив куда-нибудь, например, в &lt;span style="font-style:italic;"&gt;C:\Program Files\Borland\Delphi7\Source\Curlpas\&lt;/span&gt;. Обратите внимание, в архиве есть еще документация и примеры использования (папка demo).&lt;br /&gt;&lt;br /&gt;4. Запускаем батник &lt;span style="font-style:italic;"&gt;Makewin.bat&lt;/span&gt; с параметром &lt;span style="font-style:italic;"&gt;src&lt;/span&gt; (или &lt;span style="font-style:italic;"&gt;all&lt;/span&gt;, чтобы уж не мелочиться :) ).&lt;br /&gt;&lt;br /&gt;Смотрим лог выполнения инструкций. Там должно быть что-то вроде "все успешно" по каждой директиве.&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 := 'http://parsing-and-i.blogspot.com/';&lt;br /&gt;  Curl.OutputFile := 'curl.html';&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="http://parsing-and-i.blogspot.com/"&gt;моего блога&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Возможные ошибки при установке Curlpas&lt;/h2&gt;&lt;br /&gt;По каким-то причинам могут не "подхватиться" библиотеки. Тогда после запуска приложения может появиться что-то типа такого сообщения:&lt;br /&gt;&lt;div class="error"&gt;Приложению не удалось запуститься, поскольку libcurl-3.dll не был найден. Повторная установка приложения может решить эту проблему.&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dS8cdXcqCug/TOGjHT-ncTI/AAAAAAAAATA/LA3vM0HzRsE/s1600/curl_error.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 61px;" src="http://4.bp.blogspot.com/_dS8cdXcqCug/TOGjHT-ncTI/AAAAAAAAATA/LA3vM0HzRsE/s400/curl_error.jpg" border="0" alt="Ошибка при установке libcurl в Delphi" title="Ошибка при установке libcurl в Delphi" id="BLOGGER_PHOTO_ID_5539888362659737906" /&gt;&lt;/a&gt;&lt;br /&gt;Если компилятор запрашивает файл &lt;span style="font-style:italic;"&gt;libcurl-3.dll&lt;/span&gt;, а в скачанном пакете &lt;span style="font-weight:bold;"&gt;libcurl&lt;/span&gt; у вас файл называется &lt;span style="font-style:italic;"&gt;libcurl.dll&lt;/span&gt; (зависит от версии библиотеки), то найдите файл &lt;span style="font-style:italic;"&gt;curl_h.pas&lt;/span&gt; (из папки &lt;span style="font-style:italic;"&gt;C:\Program Files\Borland\Delphi7\Source\Curlpas\src\&lt;/span&gt;, если вы устанавливали по моей инструкции) и в нем исправьте название файла.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dS8cdXcqCug/TOGiGxw3hSI/AAAAAAAAAS4/f4dXSnR5hIM/s1600/curl_h.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 361px;" src="http://2.bp.blogspot.com/_dS8cdXcqCug/TOGiGxw3hSI/AAAAAAAAAS4/f4dXSnR5hIM/s400/curl_h.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5539887253963638050" /&gt;&lt;/a&gt;&lt;br /&gt;Потом перекомпилируйте библиотеку.&lt;br /&gt;&lt;br /&gt;Если не находятся какие-то другие dll — еще раз проверьте их наличие в &lt;span style="font-style:italic;"&gt;System32&lt;/span&gt; (или другом каталоге, как у вас принято).&lt;br /&gt;&lt;br /&gt;Вот, в общем-то, и все — установка завершена, можете работать с библиотекой дальше. В папке &lt;span style="font-style:italic;"&gt;doc&lt;/span&gt; — достаточно полная документация. А онлайн документация есть &lt;a href="http://curlpas.sourceforge.net/doc/" rel="nofollow" title="Онлайн-документация по CurlPas"&gt;здесь&lt;/a&gt;.&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href="http://feeds2.feedburner.com/parsing-lessons"  rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/vLQtuy-IMuQ" height="1" width="1"/&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="http://3.bp.blogspot.com/_dS8cdXcqCug/TOGgNsTd88I/AAAAAAAAASo/__Pn1WL2yYo/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>Два месяца не появлялась, на то были причины. Понемногу начну исправляться: разгребать почту, чистить комменты (очень много спама, а я по старинке привыкла доверять людям и захожу по каждому адресу, указанному комментаторами), смотреть зафоловивших меня в твиттере. Писем в ящике, указанном в профиле, очень много. Это мой неосновной ящик, поэтому только-только добралась. Даже не знаю, как поступить: отвечать или не отвечать на "старые" предложения (наверное, у них уже вышел "срок годности". Тут дилема: предстать невежливой или предстать тормозом :) ).&lt;br /&gt;&lt;br /&gt;Начало осени было очень насыщенным: периоды интенсивной работы чередовались с интенсивным же отдыхом. Съездили с мужем отдохнуть в Таиланд. Несколько фоток.&lt;br /&gt;&lt;br /&gt;Одно из "обычных состояний" — с картой в руках. Я — навигатор :)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dS8cdXcqCug/TNqS-7HcZAI/AAAAAAAAASQ/0PK-LBP-Gck/s1600/x_d44cddee.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/_dS8cdXcqCug/TNqS-7HcZAI/AAAAAAAAASQ/0PK-LBP-Gck/s320/x_d44cddee.jpg" border="0" alt="Тайланд, Бангкок" id="BLOGGER_PHOTO_ID_5537900301523903490" /&gt;&lt;/a&gt;&lt;br /&gt;Я и кузнечик: кто кого?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dS8cdXcqCug/TNqS_nI6j4I/AAAAAAAAASY/8I6SmI849SY/s1600/x_a278319f.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://1.bp.blogspot.com/_dS8cdXcqCug/TNqS_nI6j4I/AAAAAAAAASY/8I6SmI849SY/s320/x_a278319f.jpg" border="0" alt="Паттайя. Кузнечик"id="BLOGGER_PHOTO_ID_5537900313341235074" /&gt;&lt;/a&gt;&lt;br /&gt;Ну и широко известные тайские мальчики-девочки. Это самые "очевидные". Большинство же такие, что для идентификации надо приглядеться :)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dS8cdXcqCug/TNqTAJ946hI/AAAAAAAAASg/JBvj-1trE3c/s1600/x_ae4581cd.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_dS8cdXcqCug/TNqTAJ946hI/AAAAAAAAASg/JBvj-1trE3c/s320/x_ae4581cd.jpg" border="0" alt="Тайские девочки (в кавычках)"id="BLOGGER_PHOTO_ID_5537900322690230802" /&gt;&lt;/a&gt;&lt;br /&gt;Фотографий привезли — море. Но здесь им, конечно, не место :)&lt;br /&gt;&lt;br /&gt;Замечательная страна. Всерьез подумываем поселиться там и пожить некоторое время. Естественно, что для этого надо трудиться и налаживать источники доходов, не привязанные к месту жительства. В принципе, чем мы сейчас и занимаемся.&lt;br /&gt;&lt;br /&gt;Парсеры на заказ в настоящее время не пишу, обращаться не стоит. Пишу приложения для торговли на бирже с использованием &lt;a href="http://ttools.ru/?page_id=430#10"&gt;QuikOrdersDOM SDK&lt;/a&gt; (SDK для работы с Квиком). Занимаюсь своими проектами (это как раз относится к "налаживанию источников дохода", о котором упоминалось в предыдущем абзаце). Для своих проектов программирую по мелочам, так что, в принципе, писать на блоге есть о чем — в ближайшем будущем посты ожидаются :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Товарищи!&lt;/span&gt; По поводу &lt;a href="http://parsing-and-i.blogspot.com/2009/08/rssadder-rss-rss.html"&gt;RSSAdder-а&lt;/a&gt;. В свое время я обещала постовые всем, кто напишет обзор у себя на блогах. Я про это не забыла, только вот вычислить написавших мне трудно: blogger не показывает, а самой мне искать совсем некогда. Оставляйте в комментах ссылки на обзоры — все обещанные постовые будут размещены в новых записях на этом блоге.&lt;br /&gt;&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Зачем тянуть с объявлением благодарностей? :) Спасибо &lt;span style="font-weight:bold;"&gt;artcher-у&lt;/span&gt;, автору блога &lt;a href="http://artcher.net"&gt;"Web как философия жизни"&lt;/a&gt; за прекрасный &lt;a href="http://artcher.net/2010/10/31/"&gt;обзор RSSAdder-а с картинками&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Так же спасибо &lt;a href="http://www.seozip.ru/"&gt;SeoZIP-у&lt;/a&gt; ) Желаю удачи в развитии блога!&lt;br /&gt;___&lt;br /&gt;&lt;br /&gt;Чтобы быть в курсе обновлений блога, можно &lt;a href="http://feeds2.feedburner.com/parsing-lessons"  rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/nf2s9TbJp0I" height="1" width="1"/&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="http://4.bp.blogspot.com/_dS8cdXcqCug/TNqS-7HcZAI/AAAAAAAAASQ/0PK-LBP-Gck/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="http://parsing-and-i.blogspot.com/2009/08/rssadder-rss-rss.html"&gt;RSSAdder&lt;/a&gt; для полуавтоматического добавления RSS-лент в RSS-агрегаторы.&lt;br /&gt;&lt;br /&gt;Выкладываю новый конфиг. Этот конфиг "увидел свет" благодаря &lt;a href="http://dsi5.org.ua/"&gt;Никите&lt;/a&gt;, который прислал свои исправления (из списка удалено 2 неработающих агрегатора) и добавления (добавлено аж 27 новых агрегаторов!), за что ему &lt;span style="font-weight:bold;"&gt;огромное спасибо&lt;/span&gt; :)&lt;br /&gt;&lt;br /&gt;Сама я новый список еще не тестировала, но, наверное, вскоре пройдусь по нему.&lt;br /&gt;&lt;br /&gt;Ссылка для скачивания: &lt;a href="http://narod.ru/disk/24043375000/RSSAdder.ini.html"&gt;новый конфиг для RSSAdder-а (82 агрегатора)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Надеюсь, всем пригодится :)&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/O8HLAQACXl4" height="1" width="1"/&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="font-weight:bold;"&gt;Как работать с RegExp в библиотеках?&lt;/span&gt; Дело в том, что библиотека &lt;span style="font-weight:bold;"&gt;VBScript_RegExp_55_TLB&lt;/span&gt; — майкрософтская, без проблем тут не обошлось.&lt;br /&gt;&lt;br /&gt;Вроде экземпляр объекта TRegExp создается, но при попытке с ним поработать вылазит ошибка:&lt;br /&gt;&lt;br /&gt;&lt;div class="error"&gt;Не был произведен вызов CoInitialize.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Если честно, столкнулась с этим впервые, пошла в интернет искать. Пришлось подключать &lt;span style="font-weight:bold;"&gt;ActiveX&lt;/span&gt; и использовать &lt;span style="font-weight:bold;"&gt;CoInitialize/CoUninitialize&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Нашла &lt;a href="http://chrisbensen.blogspot.com/2007/06/delphi-tips-and-tricks.html" rel="nofollow"&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="font-weight:bold;"&gt;CoUninitialize&lt;/span&gt; писать без &lt;span style="font-weight:bold;"&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="http://feeds2.feedburner.com/parsing-lessons"  rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/0eJOby6z8BY" height="1" width="1"/&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="font-weight:bold;"&gt;PHP Simple Html DOM Parser&lt;/span&gt;. Даже несмотря на то, что некоторым читателям эта тема могла хорошенько поднадоесть. :) Просто хочется собрать на блоге достаточное количество материала, к которому можно было бы отсылать вопрошающих по емэйлу.&lt;br&gt;&lt;br&gt;Итак, &lt;span style="font-weight:bold;"&gt;навигация по DOM-дереву&lt;/span&gt;. Прямо здесь. Прямо сейчас. На примерах. (Так как теоретически она и так описана в инструкции к библиотеке).&lt;br&gt;&lt;br&gt;Если вы читаете эту статью, то вам уже известно, что такое DOM-структура, древовидное представление данных, узлы дерева, родитель, потомок и т.д.. Структуру html-документа в виде дерева можно наглядно посмотреть в Firebug-е.&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dS8cdXcqCug/TEQTbhEY6fI/AAAAAAAAARY/3OtM4iBlNwU/s1600/html_firebug.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 119px;" src="http://1.bp.blogspot.com/_dS8cdXcqCug/TEQTbhEY6fI/AAAAAAAAARY/3OtM4iBlNwU/s400/html_firebug.png" border="0" alt="Древовидная структура html-документа в firebug" title="Древовидная структура html-документа в firebug" id="BLOGGER_PHOTO_ID_5495538808753023474"&gt;&lt;/a&gt;&lt;br&gt;Там же есть закладка DOM, с содержимым которой советую ознакомиться новичкам. Из структуры, которая там раскрывается, вы наглядно увидите результаты обращения к дочерним элементам, отдельным узлам, свойствам, атрибутам и т.д..&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dS8cdXcqCug/TEQTb_mlnYI/AAAAAAAAARg/09nqvfF4CAc/s1600/dom_firebug.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 119px;" src="http://3.bp.blogspot.com/_dS8cdXcqCug/TEQTb_mlnYI/AAAAAAAAARg/09nqvfF4CAc/s400/dom_firebug.png" border="0" alt="DOM-структура html-документа в firebug" title="DOM-структура html-документа в firebug" id="BLOGGER_PHOTO_ID_5495538816949525890"&gt;&lt;/a&gt;&lt;br&gt;Но вернемся к PHP Simple Html DOM Parser.&lt;br&gt;&lt;a href="http://parsing-and-i.blogspot.com/2010/07/dom-html.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/RhQZmbYGPX4" height="1" width="1"/&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="http://1.bp.blogspot.com/_dS8cdXcqCug/TEQTbhEY6fI/AAAAAAAAARY/3OtM4iBlNwU/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="font-weight:bold;"&gt;Запись в лог&lt;/span&gt; я использую во всех более-менее серьезных проектах. Логирование помогает и на этапе отладки, и на этапе внедрения (иногда проще попросить прислать лог, чем со слов понять, в чем проблема). Давно уже использую для этих целей маленькую и удобную библиотечку &lt;span style="font-weight:bold;"&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="font-style:italic;"&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="font-style:italic;"&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="font-style:italic;"&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="http://parsing-and-i.blogspot.com/2010/07/delphi.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/xqffnCyJmis" height="1" width="1"/&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="font-weight:bold;"&gt;allowable_tags&lt;/span&gt; передаются теги, которые &lt;span style="font-weight:bold;"&gt;не надо удалять&lt;/span&gt;. Функция работает, но, мягко говоря, неидеально. По ходу, там нет проверки на валидность кода, что может повлечь за собой удаление текста, не входящего в тэги.&lt;br /&gt;Инициативные разработчики сложа руки не сидели — в сети можно найти доработанные функции. Хорошим примером является &lt;a href="http://forum.dklab.ru/viewtopic.php?p=153841" rel="nofollow"&gt;strip_tags_smart&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Применять или не применять готовые решения — личный выбор программиста. Так сложилось, что мне чаще всего не требуется "универсального" обработчика и бывает удобнее почистить код регулярками.&lt;br /&gt;&lt;br /&gt;От чего зависит выбор того или иного способа обработки?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. От исходного материала и сложности его анализа.&lt;/span&gt;&lt;br /&gt;Если вам нужно обрабатывать достаточно простые htmp-тексты, без какой-либо навороченной верстки, ясные, как день :), то можно использовать стандартные функции.&lt;br /&gt;Если в текстах есть определенные особенности, которые надо учесть, то тут-то и пишутся специальные обработчики. В одних может использоваться просто &lt;span style="font-weight:bold;"&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="font-weight:bold;"&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="http://realcode.ru/regexptester/"&gt;конструктор регулярных выражений&lt;/a&gt;. Начинающим разработчикам может быть полезной статья &lt;a href="http://www.pagecolumn.com/tool/all_about_html_tags.htm" rel="nofollow"&gt;"All about HTML tags. 9 Regular Expressions to strip HTML tags"&lt;/a&gt;. Посмотрите там примеры, проанализируйте логику.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. От объемов.&lt;/span&gt;&lt;br /&gt;Объемы напрямую связаны со сложностью анализа (из предыдущего пункта). Большое количество текстов увеличивает вероятность, что, пытаясь предусмотреть и почистить все регулярками, вы можете что-нибудь да упустить. В этом случае подойдет метод "многоступенчатой" очистки. То есть очистить сначала, допустим, функцией strip_tags_smart (исходники на всякий случай не удаляем). Потом выборочно просматриваем некоторое количество текстов на выявление "аномалий". Ну и "зачищаем" аномалии регулярками.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. От того, что надо получить в результате.&lt;/span&gt;&lt;br /&gt;Алгоритм обработки может быть упрощен разными способами в зависимости от ситуации. Случай, описанный мной в &lt;a href="http://parsing-and-i.blogspot.com/2010/06/wordpress-php-simple-html-dom-parser.html"&gt;одной из предыдущих статей&lt;/a&gt;, хорошо это демонстрирует. Напомню, текст там находился в div-е, в котором кроме него был еще div с "хлебными крошками", реклама адсенс, список похожих статей. При анализе выборки статей обнаружилось, что статьи не содержат рисунков и просто разбиты на абзацы с помощью &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;. Чтобы не чистить "главный" див от посторонних вещей, можно найти все абзацы (с Simple HTML DOM Parser это очень просто) и соединить их содержимое. Так что прежде чем составлять регулярки для чистки, посмотрите, нельзя ли обойтись малой кровью.&lt;br /&gt;&lt;br /&gt;Вообще, между сторонниками парсинга html-кода, основанного чисто на регулярных выражениях, и парсинга, в основе которого лежит анализ DOM-структуры документа, в сети разгораются настоящие холивары. Вот, например, на оверфлоу. Невинный с первого взгляда &lt;a href="http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/" rel="nofollow"&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="http://feeds2.feedburner.com/parsing-lessons"  rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/tPYYz2IDl0s" height="1" width="1"/&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="http://parsing-and-i.blogspot.com/2010/06/user-agent.html"&gt;юзерагенты&lt;/a&gt; на этом блоге я уже рассказывала. И говорила, что "неподставление" данных о User Agent-е в заголовок вашего запроса может выйти вам боком. Как подставить данные, если вы пользуетесь библиотекой &lt;a href="http://parsing-and-i.blogspot.com/2010/05/php-simple-html-dom-parser.html"&gt;Simple HTML DOM Parser&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Есть несколько очевидных способов.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Способ 1.&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;Используйте Simple HTML DOM Parser в связке с cURL.&lt;/span&gt;&lt;br /&gt;Самый простой способ. И для меня — самый удобный. Для установки юзерагента используйте параметр &lt;span style="font-style:italic;"&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, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');&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="font-style:italic;"&gt;Способ 2.&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;Можете установить браузер по умолчанию в &lt;a href="http://www.php.net/manual/en/filesystem.configuration.php#ini.user-agent" rel="nofollow"&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("user_agent","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");&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="font-style:italic;"&gt;Способ 3.&lt;/span&gt; &lt;span style="font-weight:bold;"&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('file_get_contents', $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;          'http'=&gt;array(&lt;br /&gt;                 'method'=&gt;"GET",&lt;br /&gt;                 'header'=&gt;"Accept-language: en\r\n" .&lt;br /&gt;                 "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n".&lt;br /&gt;                 "Cookie: foo=bar\r\n"&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('file_get_contents', $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="http://feeds2.feedburner.com/parsing-lessons"  rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/P5hn8GURPyY" height="1" width="1"/&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="font-weight:bold;"&gt;каталог статей&lt;/span&gt;, сделанный на &lt;span style="font-weight:bold;"&gt;WordPress&lt;/span&gt;. Структура рубрикатора — двухуровневая. То есть в корне находится несколько разделов, в каждом из которых могут находиться подразделы. Доступ к подразделам можно осуществить и с главной страницы и с внутренней страницы раздела. Нам, естественно, удобнее собрать все с главной.&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dS8cdXcqCug/TBdRVOyYcMI/AAAAAAAAAQw/_qXXiLhbA4c/s1600/screen1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 291px;" src="http://2.bp.blogspot.com/_dS8cdXcqCug/TBdRVOyYcMI/AAAAAAAAAQw/_qXXiLhbA4c/s400/screen1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5482940496535384258"&gt;&lt;/a&gt;&lt;br&gt;Статьи могут находиться как в главных разделах, так и в подразделах.&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dS8cdXcqCug/TBdRVYCiaLI/AAAAAAAAAQ4/l45RLcXI32g/s1600/screen2_subs.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 233px; height: 265px;" src="http://1.bp.blogspot.com/_dS8cdXcqCug/TBdRVYCiaLI/AAAAAAAAAQ4/l45RLcXI32g/s400/screen2_subs.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5482940499019065522"&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="http://parsing-and-i.blogspot.com/2010/06/wordpress-php-simple-html-dom-parser.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/WZosfPKmHDs" height="1" width="1"/&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="http://2.bp.blogspot.com/_dS8cdXcqCug/TBdRVOyYcMI/AAAAAAAAAQw/_qXXiLhbA4c/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="info"&gt;Привет! Этот пост — ответ на вопрос читателя блога. Конкретный ответ на конкретный вопрос. Именно им я хочу положить начало &lt;span style="font-weight:bold;"&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="http://parsing-and-i.blogspot.com/2010/06/delphi.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/d0SuLaiQsmY" height="1" width="1"/&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="http://4.bp.blogspot.com/_dS8cdXcqCug/TBDQLXmcYPI/AAAAAAAAAQo/zg6Ak-DUpLY/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#">теория</category><category domain="http://www.blogger.com/atom/ns#">web-автоматизация</category><title>User-Agent и идентификация. Взгляд с разных сторон</title><description>Думаю, что все, кто занимается программированием для web, знают, что такое &lt;span style="font-weight:bold;"&gt;User-Agent&lt;/span&gt; и с чем его едят. Я решила немного обобщить знания и собрать их в одной статье. Сначала определение (&lt;a href="http://ru.wikipedia.org/wiki/User_Agent" rel="nofollow"&gt;Википедия в помощь&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&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="font-weight:bold;"&gt;robots.txt&lt;/span&gt;, который должен находиться в корневой папке сайта.&lt;br /&gt;&lt;br /&gt;Вот как описан механизм работы робота Яндекса в зависимости от настроек в robots.txt (&lt;a href="http://help.yandex.ru/webmaster/?id=996567" rel="nofollow"&gt;полная версия мануала по использованию robots.txt&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;В роботе Яндекса используется сессионный принцип работы, на каждую сессию формируется определенный пул страниц, которые планирует закачать робот. Сессия начинается с закачки robots.txt сайта, если его нет, он не текстовый или на запрос робота возвращается HTTP-код отличный от '200', считается, что доступ роботу не ограничен. В самом robots.txt проверяется наличие записей, начинающихся с 'User-agent:', в них ищутся подстроки 'Yandex', либо '*' (регистр значения не имеет), причем, если обнаружено 'User-agent: Yandex', директивы для 'User-agent: *' не учитываются. Если записи 'User-agent: Yandex' и 'User-agent: *' отсутствуют, считается, что доступ роботу не ограничен.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Итак, для "управления" зоной видимости определенного робота надо добавить в robots.txt несколько строк. "Распознаются" директивы &lt;span style="font-weight:bold;"&gt;Allow&lt;/span&gt; и &lt;span style="font-weight:bold;"&gt;Disallow&lt;/span&gt;, соответственно разрешающие и запрещающие доступ роботу/краулеру/и т.д. к определенным частям вашего ресурса.&lt;br /&gt;&lt;br /&gt;Списки названий роботов поисковиков открыты, их можно без проблем найти в интернете. Вот, например, совсем недавно, буквально месяц назад (6 мая 2010 года), на блоге Яндеска был опубликован свеженький &lt;a href="http://webmaster.ya.ru/replies.xml?item_no=7783&amp;ncrnd=1247" rel="nofollow"&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;Помимо роботов поисковых систем по сети шарят множество всяких краулеров, собирающих контент для разных нужд. В буржунете их наблюдается больше, по крайней мере больше жалоб :) Краулеры могут поднимать нагрузки на ваш сервак на нежелательный уровень. А "палятся" некоторые из них, как вы уже, наверное, догадались, своими User-Agent-ами. В буржунете я не раз встречала целые списки юзерагентов для блокировки, выложенные в паблик. При желании вы можете их найти. Например: &lt;a href="http://johannburkard.de/blog/www/spam/The-top-10-spam-bot-user-agents-you-MUST-block-NOW.html" rel="nofollow"&gt;The top 10 spam bot user agents you MUST block. NOW.&lt;/a&gt; ("Десять User-agent-ов спам-ботов, которые вы ДОЛЖНЫ заблокировать. НЕМЕДЛЕННО.") Или, как вариант, можете посмотреть сайт &lt;a href="http://www.botsvsbrowsers.com/" rel="nofollow"&gt;Bots vs Browsers&lt;/a&gt;, на котором в момент написания статьи собрана информация о 499551 юзерагентах, из которых ботов - 4439. Или уже известный многим сайт www.user-agents.org.&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; width: 400px; height: 26px;" src="http://2.bp.blogspot.com/_dS8cdXcqCug/TAu5CF2YjjI/AAAAAAAAAQg/Zgrq7jARBLk/s400/logo.png" border="0" alt="User-Agents vs browsers"id="BLOGGER_PHOTO_ID_5479676817207496242" /&gt;&lt;br /&gt;&lt;br /&gt;Информацию о юзерагентах ваших "посетителей" вы можете посмотреть в лог-файле статистики. Если увидите что-нибудь подозрительное — уже знаете, как поступить :)&lt;br /&gt;&lt;br /&gt;&lt;div class="info"&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 поддерживают возможность подстановки в заголовки формируемых запросов "левой" информации о браузере. Не забудьте поменять установленные по умолчанию значения на что-нибудь более правдоподобное. (Отсутствие информации о браузере подозрительно в первую очередь). У 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="http://feeds2.feedburner.com/parsing-lessons"  rel="nofollow"&gt;подписаться на RSS&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/MEemrurL_34" height="1" width="1"/&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="http://2.bp.blogspot.com/_dS8cdXcqCug/TAu5CF2YjjI/AAAAAAAAAQg/Zgrq7jARBLk/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="font-weight:bold;"&gt;проблемой обработки больших CSV-файлов на PHP&lt;/span&gt; в первый раз я столкнулась недавно. На PHP я вообще мало программирую, только если возникают задачи написать что-либо конкретно на этом языке.&lt;br&gt;&lt;br&gt;В предыдущей статье были рассмотрены &lt;a href="http://parsing-and-i.blogspot.com/2010/05/csv-mysql.html"&gt;разные варианты импорта CSV-файла в базу данных MySQL&lt;/a&gt;. Там же я отметила, что работа с большими файлами требует особого подхода. Основным ограничением для импорта большого объема данных является время выполнения скрипта, которое задается хостером (как правило 30 секунд).&lt;br&gt;&lt;br&gt;Мне необходимо было именно автоматизировать процесс полного импорта. Перед вставкой в таблицу значения полей, полученные из scv-файла, требовали анализа и дополнительной обработки.&lt;br&gt;&lt;br&gt;Когда я прочитала в описании утилиты &lt;span style="font-weight:bold;"&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="font-weight:bold;"&gt;Перевод:&lt;/span&gt; Скрипт выполняет лишь небольшую часть SQL-команд из файла и перезапускает сам себя. В следующий раз импорт начинается с того места, в котором скрипт прервал свою работу.)&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;я поняла, что мне обязательно нужно попробовать такое решение. Поиски в инете чего-то похожего окончились успешно.&lt;br&gt;&lt;a href="http://parsing-and-i.blogspot.com/2010/05/php-csv.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/qb_0X-6ahBk" height="1" width="1"/&gt;</description><link>http://parsing-and-i.blogspot.com/2010/05/php-csv.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-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="font-weight:bold;"&gt;PHPMyAdmin&lt;/span&gt;-е.&lt;br&gt;&lt;br&gt;Выбираем нужную таблицу, на вкладке &amp;quot;Структура&amp;quot; внизу нажимаем на &amp;quot;&lt;span style="font-style:italic;"&gt;Вставить текстовые файлы в таблицу&lt;/span&gt;&amp;quot;. Указаваем настройки импорта.&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dS8cdXcqCug/S_5fVPGyCLI/AAAAAAAAAQQ/cAIg5H4B36M/s1600/import_link.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 298px; height: 31px;" src="http://3.bp.blogspot.com/_dS8cdXcqCug/S_5fVPGyCLI/AAAAAAAAAQQ/cAIg5H4B36M/s400/import_link.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5475919015365970098"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dS8cdXcqCug/S_5fVbo9H1I/AAAAAAAAAQY/GwvRvS4OKjo/s1600/import_options_phpmyadmin.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 277px;" src="http://3.bp.blogspot.com/_dS8cdXcqCug/S_5fVbo9H1I/AAAAAAAAAQY/GwvRvS4OKjo/s400/import_options_phpmyadmin.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5475919018730528594"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Внимание! Если после нажатия &amp;quot;Выполнить&amp;quot; у вас вылезли ошибки типа&lt;br&gt;&lt;br&gt;&lt;div class="error"&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="font-weight:bold;"&gt;файл, предназначенный для импорта, слишком большой&lt;/span&gt;. В старых версиях PHPMyAdmin (младше 2.7.0) был баг с импортом больших файлов. Так что, возможно, выходом из ситуации будет обновление PHPMyAdmin-а.&lt;br&gt;&lt;br&gt;&lt;div class="info"&gt;(Ссылка на &lt;a href="http://www.phpmyadmin.net/documentation/Documentation.html#faq1_16" rel="nofollow"&gt;пункт 1.16 FAQ&lt;/a&gt;) Начиная с версии 2.7.0 функция импорта была переписана и проблем с импортом больших файлов не должно возникать.&lt;br&gt;&lt;br&gt;Следующее, что можно проверить (или спросить у провайдера), - это значения параметров &lt;span style="font-weight:bold;"&gt;upload_max_filesize&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;memory_limit&lt;/span&gt; и &lt;span style="font-weight:bold;"&gt;post_max_size&lt;/span&gt; в конфигурационном файле &lt;span style="font-weight:bold;"&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="http://www.phpmyadmin.net/documentation/Documentation.html#cfg_UploadDir" rel="nofollow"&gt;$cfg[&amp;#39;UploadDir&amp;#39;]&lt;/a&gt;. Она позволяет настроить загрузку файла на сервер через scp, ftp или другим методом. PhpMyAdmin может работать с файлами, расположенными во временном каталоге. Более подробную информацию читайте в разделе &lt;a href="http://www.phpmyadmin.net/documentation/Documentation.html#config" rel="nofollow"&gt;Настройки&lt;/a&gt; документации.&lt;br&gt;&lt;br&gt;б) Используйте сторонние утилиты (например, &lt;a href="http://www.ozerov.de/bigdump.php" rel="nofollow"&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="http://www.webmasterworld.com/forum88/8393.htm" rel="nofollow"&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="warning"&gt;Если вы предполагаете работать с большими файлами, то так просто описанные ниже способы вам тоже могут не подойти. Вам нужно будет провести на подготовительном этапе действия, описанные в пункте об импорте больших файлов через PHPMyAdmin.&lt;/div&gt;&lt;br&gt;&lt;a href="http://parsing-and-i.blogspot.com/2010/05/csv-mysql.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/MMKKW7pRrFg" height="1" width="1"/&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="http://3.bp.blogspot.com/_dS8cdXcqCug/S_5fVPGyCLI/AAAAAAAAAQQ/cAIg5H4B36M/s72-c/import_link.gif" height="72" width="72" /><thr:total>11</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="font-weight:bold;"&gt;PHP Simple HTML DOM Parser&lt;/span&gt;. В последнее время частенько ей пользовалась: нравятся ее возможности и простота. Скачать библиотеку можно со &lt;a href="http://sourceforge.net/projects/simplehtmldom/files/" rel="nofollow"&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="http://simplehtmldom.sourceforge.net/manual.htm" rel="nofollow"&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-&amp;gt;find(&amp;#39;a&amp;#39;);&lt;br&gt;&lt;br&gt;// Найти (N)-ую по счету ссылку и возвратить найденный объект или null в случае, если объект не найден&lt;br&gt;$ret = $html-&amp;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-&amp;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-&amp;gt;find(&amp;#39;div[id]&amp;#39;);&lt;br&gt;&lt;br&gt;// Найти все элементы, имеющие атрибут id&lt;br&gt;$ret = $html-&amp;gt;find(&amp;#39;[id]&amp;#39;);&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Ну и, конечно, стандарто - в библиотеку заложена возможность перемещения по списку элементов объектного дерева. Для этого используются:&lt;br&gt;&lt;pre&gt;$e-&amp;gt;children( [int $index] ), &lt;br&gt;$e-&amp;gt;parent(), &lt;br&gt;$e-&amp;gt;first_child(), &lt;br&gt;$e-&amp;gt;last_child(),&lt;br&gt;$e-&amp;gt;next_sibling(), &lt;br&gt;$e-&amp;gt;prev_sibling().&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Прежде чем на страницах этого блога приводить примеры парсеров, написанных с использованием этой библиотеки, я решила протестировать, насколько соответствует реальности обещанное быстродействие. Явных тормозов я за ней не замечала, но хотелось бы получить доказательство в цифрах.&lt;br&gt;&lt;a href="http://parsing-and-i.blogspot.com/2010/05/php-simple-html-dom-parser.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/w90maxGF-C0" height="1" width="1"/&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="http://1.bp.blogspot.com/_dS8cdXcqCug/S_UzhBztpyI/AAAAAAAAAP4/Qt0MNL0UFIk/s72-c/res_simple_dom.png" height="72" width="72" /><thr:total>26</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-4706686380512793736</guid><pubDate>Tue, 27 Apr 2010 09:10:00 +0000</pubDate><atom:updated>2010-06-11T10:56:02.647+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">IHTMLDocument2</category><title>Работа с комбобоксами (SELECT) в TWebbrowser</title><description>В интернете достаточно материала о том, &lt;span style="font-weight:bold;"&gt;как работать с элементом SELECT в TWebBrowser&lt;/span&gt;. У себя на блоге я мельком уже задевала уже этот вопрос, но вот решила написать отдельный пост.&lt;br&gt;Тем, для кого этот материал вновинку, сначала советую ознакомиться со статьями:&lt;br&gt;&lt;br&gt;1. &lt;a href="http://parsing-and-i.blogspot.com/2009/06/twebbrowser-oleobject.html"&gt;TWebBrowser, OleObject и его свойства&lt;/a&gt;.&lt;br&gt;2. &lt;a href="http://parsing-and-i.blogspot.com/2009/09/twebbrowser.html"&gt;Работа с формами в TWebBrowser&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Обычно я делаю так: сначала ищу на форме нужный селект по имени (тип искомого объекта - IHTMLSelectElement (не забудьте подключить библиотеку &lt;span style="font-weight:bold;"&gt;MSHTML&lt;/span&gt;)). Селект можно находить &lt;span style="font-weight:bold;"&gt;по id или по name&lt;/span&gt;, в зависимости от требований. Вот пример функции, возращающей требуемый элемент (проверяется и по id, и по name):&lt;br&gt; &lt;br&gt;&lt;pre&gt;function FindCBByName(CBName: String) : IHTMLSelectElement;&lt;br&gt;&lt;br&gt;function TMainF.FindCBByName(CBName: String): IHTMLSelectElement;&lt;br&gt;var&lt;br&gt;  i : integer;&lt;br&gt;  DocSelect   : IHTMLElementCollection;&lt;br&gt;  DocElement  : IHtmlElement;&lt;br&gt;  Doc         : IHTMLDocument2;&lt;br&gt;begin&lt;br&gt;  Result := nil;&lt;br&gt;  WB.Document.QueryInterface(IHTMLDocument2, Doc);&lt;br&gt;  DocSelect := Doc.all.tags(&amp;#39;SELECT&amp;#39;) as IHTMLElementCollection;&lt;br&gt;&lt;br&gt;  for i := 0 to DocSelect.length-1 do&lt;br&gt;    begin&lt;br&gt;      DocElement := DocSelect.Item(i, 0) as IHtmlElement;&lt;br&gt;      if (UpperCase(DocElement.id) = UpperCase( CBName )) or  &lt;br&gt;         (UpperCase(DocElement.getAttribute(&amp;#39;name&amp;#39;,0)) = UpperCase( CBName )) then&lt;br&gt;        begin&lt;br&gt;          Result := DocElement as IHTMLSelectElement;&lt;br&gt;          exit;&lt;br&gt;        end;&lt;br&gt;    end;&lt;br&gt;end;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;В случае, если объект не найден, возвращается nil. В данном примере у меня привязка к объекту TWebBrowser (WB) на форме. Можно избавиться от нее, добавив TWebBrowser в качестве параметра функции (я так обычно и делаю).&lt;br&gt;&lt;br&gt;Когда элемент найден, в нем надо будет выбрать значение. В зависимости от задачи, требуется обычно выбрать option по тексту или по value.&lt;br&gt;&lt;br&gt;В качестве примера привожу процедурку, которая уже &amp;quot;светилась&amp;quot; в статьях на этом блоге.&lt;br&gt;&lt;a href="http://parsing-and-i.blogspot.com/2010/04/select-twebbrowser.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/jfCgKnOLDt0" height="1" width="1"/&gt;</description><link>http://parsing-and-i.blogspot.com/2010/04/select-twebbrowser.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_dS8cdXcqCug/S9arONqKN-I/AAAAAAAAAPo/6tnKktov9WI/s72-c/yandex_secret_quest.png" height="72" width="72" /><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3533262157176083768.post-3706065276101260844</guid><pubDate>Fri, 23 Apr 2010 10:31:00 +0000</pubDate><atom:updated>2010-06-11T10:56:37.632+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Установка web-сервера (XAMPP) на Ubuntu на Eee PC</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dS8cdXcqCug/S9F4dm2V_AI/AAAAAAAAAPY/mpEC0e1vA_E/s1600/asus-eee-pc-xampp.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 192px;" src="http://3.bp.blogspot.com/_dS8cdXcqCug/S9F4dm2V_AI/AAAAAAAAAPY/mpEC0e1vA_E/s320/asus-eee-pc-xampp.jpg" border="0" alt="install xampp on eee pc" title="Установка XAMPP на Eee PC" id="BLOGGER_PHOTO_ID_5463280273017142274"&gt;&lt;/a&gt;&lt;br&gt;Чтобы в дороге и в отпуске заниматься программированием, решила &lt;span style="font-weight:bold;"&gt;на нетбук установить сервер&lt;/span&gt;. Порывшись в инете, остановилась на &lt;a href="http://www.apachefriends.org/en/xampp-linux.html" rel="nofollow"&gt;XAMPP&lt;/a&gt;. Скачала дистрибутив последней версии с официального сайта. При попытке установить пакет на Eee PC, вылезло сообщение о том, что на диске недостаточно места. Меня это удивило, так как места было вполне достаточно. Но, как потом оказалось, не там, где надо :) С линуксом я до этого момента практически не имела дела, поэтому на разбирательства ушло какое-то время.&lt;br&gt;&lt;br&gt;Сначала пришлось познакомиться с некоторыми базовыми командами.&lt;br&gt;&lt;span style="font-weight:bold;"&gt;Консоль&lt;/span&gt; можно вызвать с помощью сочетания горячих клавиш &lt;span style="font-weight:bold;"&gt;&amp;quot;Ctrl+Alt+T&amp;quot;&lt;/span&gt;. Если оно не срабатывает (было, что один раз сглючило, и положение исправилось только после перезагрузки), то можно загрузить &lt;span style="font-weight:bold;"&gt;диспетчер файлов&lt;/span&gt; и при открытом окне нажать &lt;span style="font-weight:bold;"&gt;&amp;quot;Ctrl+T&amp;quot;&lt;/span&gt;.&lt;br&gt;&lt;br&gt;&lt;pre&gt;cd - смена текущей директории&lt;br&gt;ls - листинг каталога&lt;br&gt;chmod - изменение прав доступа на файл/директорию&lt;/pre&gt;&lt;br&gt;&lt;br&gt;и так далее. В принципе, тех, которые мне потребовались, с полдесятка.&lt;br&gt;&lt;a href="http://parsing-and-i.blogspot.com/2010/04/web-xampp-ubuntu-eee-pc.html#more"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/parsing-lessons/~4/F39UPFg82mg" height="1" width="1"/&gt;</description><link>http://parsing-and-i.blogspot.com/2010/04/web-xampp-ubuntu-eee-pc.html</link><author>noreply@blogger.com (Masha)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_dS8cdXcqCug/S9F4dm2V_AI/AAAAAAAAAPY/mpEC0e1vA_E/s72-c/asus-eee-pc-xampp.jpg" height="72" width="72" /><thr:total>2</thr:total></item></channel></rss>
