Конфигурационный файл HTML-парсера
Пример
<HtmlParser>
<Zones>
zonename : zone1,zone2, ...
...
</Zones>
<Attributes>
attrname : attr1,attr2, ...
...
</Attributes>
</HtmlParser>
Проектирование конфигурации HTML-парсера
Конфигурация HTML-парсера проектируется в соответствии с типичными поисковыми задачами, которые могут возникнуть для данной коллекции документов. В процессе разработки конфигурации рекомендуется придерживаться следующих основных шагов.
- Определить имена поисковых зон и поисковых атрибутов, которые будут участвовать в языке запросов.
Пример: Для поиска по подзаголовкам документов введем поисковую зону header. Для поиска по тексту ссылок на другие документы введем поисковую зону anchor. Для поиска по адресам ссылок на другие документы введем поисковый атрибут link.
- Для каждой поисковой зоны указать список имен HTML-тегов, содержимое которых должно принадлежать данной поисковой зоне.
Пример: Определим, что поисковой зоне header принадлежит текст документа, находящийся внутри любого из тегов <h1>...</h1>, <h2>...</h2> или <h3>...</h3>.
- Определить, будут ли некоторые поисковые зоны условными. Условными будут называться поисковые зоны, образуемые только при наличии заданного поискового атрибута. Для списка HTML-тегов, определяющего поисковую зону, может быть дополнительно указано имя некоторого поискового (не HTML!) атрибута. Если имя указано, и при попытке создать поисковую зону из содержимого данного HTML-тега эта зона не получает поискового атрибута с указанным именем (и любым значением), то поисковая зона не создается.
Пример: Допустим поисковой зоне anchor должен принадлежать текст документа, находящийся внутри тега <a>...</a>, но только при условии, что данный текст ссылается на другой документ. Для этого данный тег должен иметь HTML-атрибут href. Поэтому определим поисковую зону anchor как условную, возникающую только при наличии поискового атрибута link, описанного в следующем примере.
- Для каждого поискового атрибута выбрать его тип (из числа описанных в разделе Типы поисковых атрибутов) и список пар (имя HTML-тега, имя HTML-атрибута этого тега). Если у HTML-тега, имя которого совпадает с первым именем в паре имеется HTML-атрибут, имя которого совпадает со вторым именем в паре, то значение этого HTML-тега распознается как значение определяемого поискового атрибута по правилам, специфичным для указанного типа поискового атрибута.
Пример: Определим, что поисковый атрибут link имеет тип URL и значениями этого атрибута будут значения HTML-атрибута href HTML-тега <a> и значения HTML-атрибута src HTML-тега <frame>.
Конфигурация парсера, спроектированная в примерах данного раздела, имеет следующий вид.
<HtmlParser>
<Zones>
header : h1,h2,h3
anchor : a/link
</Zones>
<Attributes>
link : URL,any/a.href,frame.src
</Attributes>
</HtmlParser>
Формальные правила описания конфигурации приведены в следующем разделе.
Синтаксис конфигурационного файла
Описание дополнительных настроек HTML-парсера размещается в отдельном файле. При этом в секции DocFormat конфигурационного
файла индексатора нужно задать путь к файлу конфигурации парсера (путь к файлу указывается через директиву Config). Вся конфигурация парсера должна быть размещена внутри секции <HtmlParser>. Директивы, определяющие поисковые зоны, располагаются внутри подсекции <Zones>, а директивы, определяющие поисковые атрибуты - внутри подсекции <Attributes>.
Далее приводятся формальные правила написания конфигураций, и даются конкретные примеры с подробными комментариями.
Конфигурирование поисковых зон
Пример
Формальные правила описания зон можно представить следующим набором выражений:
<Zones>
yxzone : htelem(,htelem)*
yxzone : htelem(,htelem)*/yxattr
</Zones>
где:
- yxzone - имя поисковой зоны;
- htelem - имя HTML-тега;
- yxattr - имя поискового атрибута, определяющего условную поисковую зону;
- (...)* - ноль, один или несколько элементов.
Имя поисковой зоны не может совпадать с одним из зарезервированных имен "doc", "empty", "any".
Вместо имени HTML-тега допустимо использовать символ "_" (подчеркивание). Он означает любой тег.
Пример: Текст внутри тега “title” принадлежит поисковой зоне “title”.
Пример: Текст внутри всех элементов “Hn”, а также заголовки таблиц принадлежат поисковой зоне “header” .
header : h1,h2,h3,h4,h5,h6,caption
Пример: Текст внутри тега “a” принадлежит поисковой зоне “anchor” только при условии, что имеется поисковый атрибут “link”.
Конфигурирование поисковых атрибутов
Пример
Формальные правила описания поисковых атрибутов можно представить следующим набором выражений:
<Attributes>
yxattr : TYPE/htelem.htattr(,htelem.htattr)*
yxattr : TYPE,yxzone/htelem.htattr(,htelem.htattr)*
yxattr : TYPE,yxzone,function/htelem.htattr(,htelem.htattr)*
yxattr : TYPE,yxzone,function,ignore/htelem.htattr(,htelem.htattr)*
# только для атрибутов типа URL
yxattr : TYPE,yxzone,function,ignore,ext( ext)*/htelem.htattr(,htelem.htattr)*
yxattr : TYPE,yxzone,function,ignore,ext( ext)*,local/htelem.htattr(,htelem.htattr)*
</Attributes>
где:
- yxzone - имя поисковой зоны;
- yxattr - имя поискового атрибута;
- htelem - имя HTML-тега;
- htattr - имя HTML-атрибута;
- (...)* - ноль, один или несколько элементов;
- TYPE - тип поискового атрибута, как описано в разделе Типы поисковых атрибутов;
- function - одно из строковых значений, указанных ниже, определяющих правила распознавания текста атрибута;
- ignore - флажок, указывающий, что документный атрибут надо распознавать, но не надо запоминать его в индексных файлах. Используется для создания группировочных атрибутов;
- ext - список расширений имен файлов разделенных пробелами;
- local - флажок для пометки только локальных (внутрисайтовых) ссылок.
Символ "_" (подчеркивание) вместо имени HTML-тега или HTML-атрибута обозначает любой элемент или атрибут. Если символ "_" задан вместо имени поискового атрибута, имя поискового атрибута будет совпадать с именем HTML-атрибута.
Пример: Многие HTML-теги могут иметь всплывающую подсказку, заданную через HTML-атрибут title. Чтобы проиндексировать все эти атрибуты, можно определить поисковый атрибут tooltip следующим образом:
Каждое из слов текста атрибута title любого HTML-тега войдет в индекс с учетом морфологии.
Особый случай представляют собой теги <META> и <LINK>. Для удобства их использования принято, что именем атрибута тега <META> является значение атрибутов NAME или HTTP-EQUIV, а значением - содержимое атрибута CONTENT. Для тега <LINK> именем атрибута считается значение атрибутов REL/REV, а значением - содержимое атрибута HREF.
Пример: Каждый документ в электронной библиотеке содержит meta-тег следующего вида:
<meta name="author" content="_имя_автора_">
Чтобы обеспечить поиск документов, принадлежащих конкретному автору, определим поисковый атрибут author:
author : TEXT/meta.author
Пример:
email : URL/link.made
_ : TEXT/meta._
_ : URL/link._
Это означает, что будут проиндексированы все встретившиеся в документах META и LINK теги. Причем, если в LINK значение одного из его атрибутов окажется равно made, то поисковый атрибут будет иметь имя email. Во всех остальных случаях (это касается и META) будут образовываться поисковые атрибуты с именами, равными соответствующим значениям атрибутов данных тегов. Это позволяет решить проблему постоянного добавления в конфигурацию записей при каждом появлении нового, еще не описанного META или LINK тега. В настройках подобного вида приоритет имеют явно заданные имена атрибутов.
Если название поисковой зоны после типа атрибута опущено, поисковый атрибут будет документным атрибутом. Если имя поисковой зоны указано, возможны следующие случаи:
| Значение |
Описание |
|
doc
|
Документный атрибут, тот же самый результат получается, если имя зоны не указывать. |
|
empty
|
Атрибут данной точки документа, то есть атрибут специальной зоны нулевой длины, как обсуждалось в Поисковые зоны и атрибуты. |
|
any
|
Если для содержимого данного HTML-элемента сформирована поисковая зона, поисковый атрибут является атрибутом этой зоны. В противном случае это атрибут данной точки документа. |
|
другое имя
|
Если из содержимого HTML-элемента не сформирована поисковая зона с данным именем, поисковый атрибут не создается. |
Пример: Для поиска картинок по именам файлов определим поисковый атрибут image:
image : URL,empty/img.src
Аргумент function может принимать следующие значения:
| Значение |
Описание |
|
parse_http_expires
|
Распознавать текст атрибута по правилам, применяемым для meta.expires. |
|
parse_http_refresh
|
Распознавать текст атрибута по правилам, применяемым для meta.refresh. |
|
parse_http_charset
|
Распознавать текст атрибута по правилам, применяемым для meta.content-type. |
|
parse_meta_robots
|
Распознавать текст атрибута по правилам, применяемым для meta.robots. |
|
parse_data_integer
|
Распознавать текст атрибута как целое число. |
Аргумент function может быть пропущен. В этом случае применяются правила распознавания атрибута по умолчанию, в соответствии с его типом.
Имена поисковых атрибутов типа URL могут определяться не только наличием или отсутствием соответствующих тегов и их атрибутов, но и расширениями имен файлов, составляющих значение HTML-атрибута, а также фактом, является ли ссылка локальной для данного сайта или уходит на внешние ресурсы.
Пример: Создадим дополнительные поисковые атрибуты для случаев, когда HTML-атрибут представляет собой внутрисайтовую ссылку или ссылается на музыкальный файл:
# По умолчанию - расширения не даны
link : URL,anchor/a.href
link : URL,any/frame.src,iframe.src,area.href
# В случае музыкальных расширений или внутренних ссылок меняем имя атрибута
linkmp3 : URL,anchor,,,mp3 mpga mp2 ra/a.href
linkint : URL,anchor,,,,local/a.href
linkint : URL,any,,,,local/frame.src,iframe.src,area.href
Если в конфигурации зон сформирована условная зона anchor по правилу
то текст внутрисайтовых и музыкальных ссылок в эту зону не попадет.
Конфигурация по умолчанию
Ниже приведен пример конфигурационного файла для HTML-парсера. Данная настройка соответствует поведению парсера по умолчанию, то есть будет использоваться в случае, если дополнительная конфигурация парсера не указана.
Пример
<HtmlParser>
<Zones>
title : title
address : address
anchor : a/link
</Zones>
<Attributes>
_ : LITERAL/meta._
link : URL,anchor/a.href
link : URL,any/frame.src,iframe.src,area.href
link : URL/link._
robots : LITERAL,doc,parse_meta_robots,ignore/meta.robots
refresh : URL,doc,parse_http_refresh,ignore/meta.refresh
style : URL/link.stylesheet
profile : URL/head.profile
script : URL,any/script.src
image : URL,any/img.src
applet : URL,any/applet.code,applet.object
object : URL,any/object.data,object.classid
abstract : TEXT/meta.description
keywords : TEXT/meta.keywords
hint : TEXT,any/img.alt,area.alt
tooltip : TEXT,any/_.title
</Attributes>
</HtmlParser>