<groupby attr='ih' mode='deep' />
<groupby attr='d' mode='deep' />
</groupings>
</request>
Поиск в найденном — это обычное уточнение запроса. Для реализации такого варианта достаточно к первоначальному поисковому выражению добавить новое. Например, если первоначально вы искали заповедник Эйн-Геди, а затем уточняете запрос поиском информации о длиннохвостых скворцах, то ваш запрос будет выглядеть следующим образом:
(заповедник Эйн-Геди) && (длиннохвостый скворец)
Возможности XML-поиска оказались востребованными. Их использует, например, такая поисковая система, как Nigma.ru, визуальная поисковая система Quintura, система 'Телеграф' — поиск по белорусским сайтам и другие поисковые системы.
Кроме того, на основе этого варианта поиска разработано несколько простых, но весьма занятных игр, например, 'Отчество', в которой по имени и фамилии, вводимой пользователем, ищется наиболее часто встречающееся для этой пары данных отчество. Или игра 'Какого оно цвета', в которой для введенного названия предмета подыскивается наиболее часто употребляемый с ним цвет. Почему-то тыкву большинство пользователей Интернета связывают с черным цветом, но вот огурец точно оказался зеленым.
Вы можете сами придумать интересные варианты использования XML-поиска и, если они покажутся интересными и Яндексу, их могут опубликовать с указанием фамилии разработчика. Чем не успех?
Вот интересный пример (листинг 10.7), который вы можете разместить на своем сайте (при условии, что ваш сайт не является коммерческим).
Листинг 10.7. Узнай место сайта в выдаче
#!/usr/bin/perl — w — Ilib use strict;
# модули для получения информации из XML и доступа к
# веб-ресурсам, соответственно use XML::XPath;
use LWP::UserAgent;
# верхняя и нижняя части страницы require'./page-template.pl';
# библиотека функций. Например, для обработки полей присланной
# формы
require'./xml-lib.pl';
print 'Content-Type: text/html;charset=utf-8 '; print &header;
# обработка полей формы my %params = &parse_form;
my $host = $params {'host'}; my $query = $params {'query'}; my $query_esc = xmlescape($query); my $host_esc = xmlescape($host);
$host =~ s[Ahttp://|www.][];
# готовим запрос
my $ua = LWP::UserAgent->new;
$ua->agent('Bond, James Bond/0.07'); my $exit = 1;
$exit = 0 if $ENV{'REQUEST_METHOD'} eq 'POST'; my $reqid = undef; my $page = 0;
my $found = 0; my $pages = 20;
print '<table width='100 %'><tr><td width='16 %'/><td>';
# мы должны получить место сервера в выдаче по некоему запросу.
# делаем запрос по десять ссылок на страницу и запрашиваем 50
# страниц. При нахождении сервера останавливаемся и выдаем его
# место в выдаче
while (not $exit and $page < $pages and $host)
{
my $reqid_tag = '';
$reqid_tag = ' <reqid>$reqid</reqid> ' if (defined $reqid and $reqid);
# XML запрос
my $doc = <<DOC;
<?xml version='1.0' encoding='utf-8'?>
<request>
<query>$query_esc</query>
<page>$page</page>
$reqid_tag
<maxpassages>0</maxpassages>
<groupings>
<groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/>
</groupings>
</request>
DOC
my $req = HTTP::Request — > new
# (POST => 'http://xmlsearch.yandex.ru/cgi-bin/xmlsearch.pl'); (POST => 'http://xmlsearch.yandex.ru/cgi-bin/xmlsearch.pl'); $req — > content_type ('application/xml');
$req — > content ('$doc');
# отправляем запрос
my $response = $ua — > request ($req); if ($response->is_success)
{
#print $response — > content;
my $doc = XML::XPath — > new (xml => $response — > content);
# пробуем получить ошибку
my $error = $doc — > findvalue ('/yandexsearch/response/error'); if ('$error')
{
print 'Возникла следующая ошибка: ', $error, '<br/> ';
$exit = 1; last;
}
$reqid = $doc — > findvalue ('/yandexsearch/response/reqid'); my $pos = 1;
my @nodes = $doc — > findnodes ('/yandexsearch/response/results/grouping/group/doc/url');
foreach (@nodes)
{
# если URL начинается с имени хоста, выходим из цикла if ($_ — > string_value =~ m^http: // (www.)?$host/i)
{
$found = $pos + $page * 10;
$exit = 1; last;
}
$pos++;
}
$page++;
}
else