Пользователи, сталкивающиеся с разработкой на Delphi, иногда могут встретиться с проблемами при работе с веб-контентом. Одной из таких проблем является некорректное извлечение URL-адресов из элементов IHTMLDocument2. В этом руководстве мы рассмотрим, как исправить такую ошибку, и приведем несколько примеров решений.
Описание проблемы
При работе с IHTMLDocument2 в Delphi, вместо получения полного URL-адреса, например, <a href="http://ena.ge/explanatory-online">http://ena.ge/explanatory-online</a>, возвращается сокращенный путь вида about:/explanatory-online. Простой метод замены префикса "about:" на корневой URL не всегда приводит к ожидаемому результату.
Пример кода
Для начала рассмотрим исходный код, который используется для извлечения гиперссылок:
procedure process_url(MyURL: string; var MyHTML, MyHyperlinks: TStrings; var MyInnerText, MyInnerHTML: WideString);
var
resp: TMemoryStream;
IdHTTP: TidHTTP;
v: Variant;
iDoc: IHTMLDocument2;
links: OleVariant;
MyHyperlink, aHref: string;
i: integer;
begin
// ... код для загрузки HTML-контента ...
// Получение всех тегов 'A' на странице
links := iDoc.all.tags('A');
// ... код для обработки ссылок ...
end;
Подтвержденное решение
Изучив исходный код страницы, можно заметить, что ссылки в нем представлены в другом формате, например: href="/explanatory-online". Если использовать IHTMLDocument2 для загрузки страницы с помощью IdHttp, то он не будет иметь оригинального адреса страницы. В качестве решения можно использовать компонент TWebBrowser или же выполнить замену строк вручную, либо использовать IHTMLDocument4.
Пример 1 (использование TWebBrowser)
procedure process_url(MyURL: string; var MyHTML, MyHyperlinks: TStrings; var MyInnerText, MyInnerHTML: WideString);
var
Flags: System.OleVariant;
iDoc: IHTMLDocument2;
links: OleVariant;
MyHyperlink, aHref: string;
i: integer;
begin
// ... код для навигации к указанному URL с помощью TWebBrowser ...
// Получение всех тегов 'A' на странице
links := iDoc.all.tags('A');
// ... код для обработки ссылок ...
end;
Пример 2 (замена строк)
function GetDomain(URL: String): String;
begin
// ... код для получения домена URL ...
end;
procedure process_url(MyURL: string; var MyHTML, MyHyperlinks: TStrings; var MyInnerText, MyInnerHTML: WideString);
var
resp: TMemoryStream;
IdHTTP: TidHTTP;
v: Variant;
iDoc: IHTMLDocument2;
links: OleVariant;
MyHyperlink, aHref, Domain: string;
I, J: Integer;
begin
// ... код для загрузки HTML-контента ...
// Получение домена для текущего URL
Domain := GetDomain(MyURL);
// ... код для обработки ссылок с заменой домена ...
end;
Пример 3 (использование IHTMLDocument4)
function process_url(MyURL: string; var MyHTML, MyHyperlinks: TStrings; var MyInnerText, MyInnerHTML: WideString): Integer;
begin
// ... код для создания документа из URL с использованием IHTMLDocument4 ...
// ... код для обработки ссылок ...
end;
Заключение
Приведенные примеры демонстрируют, как можно исправить ошибку извлечения URL-адресов из IHTMLDocument2 в Delphi. Выбор метода зависит от конкретных требований и условий задачи. Важно помнить, что некоторые ссылки могут быть представлены в виде JavaScript-выражений, которые также необходимо обработать отдельно.
Пользователи, использующие Delphi для работы с веб-контентом, могут столкнуться с проблемой извлечения полных URL-адресов из элементов `IHTMLDocument2`, и в данном руководстве рассматриваются методы исправления этой ошибки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.