При работе с веб-страницами в среде Delphi часто возникает необходимость не только находить элементы по их тегам, но и проверять их атрибуты. В данной статье мы рассмотрим, как можно расширить функционал поиска элементов, чтобы он учитывал не только теги, но и конкретные атрибуты элементов.
Проблема
Рассмотрим код, который ищет элемент по его тегу, но не может найти элемент, учитывая атрибуты. В коде есть функция FindElement, которая должна возвращать элемент, соответствующий заданному тегу и набору атрибутов.
function FindElement(const Tag: String; const Attributes: TStringList): IHTMLElement;
begin
// ...
for i := 0 to Pred(Collection.length) do
begin
E := Collection.item(i, EmptyParam) as IHTMLElement;
Count := 0; // Обнуляем счетчик совпадений атрибутов для каждого элемента
for j := 0 to Attributes.Count-1 do
begin
// ...
if Count = Attributes.Count then
Exit(E);
// Если хотя бы один из атрибутов элемента не найден, пропускаем следующий элемент.
break;
end;
end;
end;
Решение
В коде, представленном выше, была допущена ошибка в логике проверки атрибутов. Важно обнулять счетчик совпадений атрибутов для каждого элемента и проверять все атрибуты, даже если один из них не совпадает. Кроме того, стоит обратить внимание на оптимизацию вызова метода getAttribute для каждого атрибута, что может быть неэффективно.
function FindElement(const Tag: String; const Attributes: TStringList): IHTMLElement;
var
FAttributeName, FAttributeValue: String;
AttributeValue: String;
Collection: IHTMLElementCollection;
E: IHTMLElement;
i, j: Integer;
begin
Collection := (EmbeddedWB1.Document as IHTMLDocument3).getElementsByTagName(Tag);
for i := 0 to Pred(Collection.length) do
begin
E := Collection.item(i, EmptyParam) as IHTMLElement;
var MatchCount: Integer;
MatchCount := 0;
for j := 0 to Attributes.Count-1 do
begin
FAttributeName := LowerCase(List(Attributes, j, 0, ','));
FAttributeValue := LowerCase(List(Attributes, j, 1, ','));
AttributeValue := E.getAttribute(FAttributeName, 0);
if not VarIsNull(AttributeValue) then
begin
if AttributeValue = FAttributeValue then
Inc(MatchCount, 1);
end
else
begin
// Если атрибут не найден, пропускаем проверку остальных атрибутов для данного элемента.
Break;
end;
end;
if MatchCount = Attributes.Count then
Exit(E);
end;
end;
Альтернативный подход
Некоторые атрибуты, такие как class, имеют свои собственные свойства, и getAttribute может не возвращать их. В таком случае, для атрибута class следует использовать свойство className элемента:
if FAttributeName = 'class' then
begin
if E.className = FAttributeValue then
Inc(MatchCount, 1);
end
else
begin
AttributeValue := E.getAttribute(FAttributeName, 0);
if not VarIsNull(AttributeValue) then
begin
if AttributeValue = FAttributeValue then
Inc(MatchCount, 1);
end;
end;
Заключение
В данной статье мы рассмотрели, как улучшить функционал поиска элементов на веб-странице, используя не только теги, но и атрибуты элементов. Важно помнить об обнулении счетчика совпадений для каждого элемента и о возможности использования специальных свойств для некоторых атрибутов. Приведенные примеры кода на Object Pascal (Delphi) помогут вам в реализации подобного функционала в ваших проектах.
Статья рассматривает улучшение функционала поиска элементов на веб-странице в среде Delphi, учитывая не только теги, но и атрибуты элементов, с примерами кода на Object Pascal и рекомендациями по оптимизации процесса.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.