Соскребание изображений с веб-сайта в delphi с помощью twebbrowser

я пытаюсь сделать небольшой инструмент, который загружает все изображения с посещаемого сайта. Это должно быть сделано с компонентом twebbrowser. Тестовый сайт моего клиента — Click. На данный момент я выбираю изображения с помощью getelementbyid, но у некоторых изображений нет идентификатора. Как я могу обратиться к пропавшим? Большое спасибо


person Maio Steger    schedule 23.05.2016    source источник
comment
Работа через дом в поисках изображений   -  person David Heffernan    schedule 23.05.2016


Ответы (2)


После загрузки страницы запросите свойство TWebBrowser.Document для интерфейса IHTMLDocument2, а затем вы можете перечислить элементы коллекции IHTMLDocument2.images:

var
  Document: IHTMLDocument2;
  Images: IHTMLElementCollection;
  Image: IHTMLImgElement;
  I: Integer;
begin
  Document := WebBrowser1.Document as IHTMLDocument2;
  Images := Document.images;
  For I := 0 to Images.length - 1 do
  begin
    Image := Images.item(I, '') as IHTMLImgElement;
    // use Image as needed...
  end;
end;

Обратите внимание, что изображения будут найдены только в HTML-тегах <img>. Если вам нужно найти изображения и в тегах <input type="image">, вам придется перечислить элементы IHTMLDocument2.all ищет экземпляры интерфейса IHTMLInputElement чье свойство type равно "image", например:

var
  Document: IHTMLDocument2;
  Elements: IHTMLElementCollection;
  Element: IHTMLElement;
  Image: IHTMLImgElement;
  Input: IHTMLInputElement;
  I: Integer;
begin
  Document := WebBrowser1.Document as IHTMLDocument2;
  Elements := Document.all;
  For I := 0 to Elements.length - 1 do
  begin
    Element := Elements.item(I, '') as IHTMLElement;
    if Element is IHTMLImgElement then begin
      Image := Element as IHTMLImgElement;
      // use Image as needed...
    end
    else if Element is IHTMLInputElement then begin
      Input := Element as IHTMLInputElement;
      if Input.type = 'image' then
      begin
        // use Input as needed...
      end;
    end;
  end;
end;
person Remy Lebeau    schedule 23.05.2016

Вместо того, чтобы запрашивать определенный элемент по идентификатору, вы можете «пройтись» по документу и просмотреть каждый элемент, используя WebDocument.all.item(itemnum,'').

var
  cAllElements: IHTMLElementCollection;
  eThisElement: IHTMLElement;
  WebDocument: IHTMLDocument2;

=======

 cAllElements:=WebDocument.All
  For iThisElement:=0 to cAllElements.num-1 do
    begin
      eThisElement:=cAllElements.item(iThisElement,'') as IHTMLElement;
      // check out eThisElement and do what you want
    end;

Затем вы должны просмотреть элемент .tagName для IMG или выполнить любую необходимую вам оценку, чтобы определить, является ли это изображением, и обработать его, как вы делали это раньше.

Дэн

person Dan Barclay    schedule 23.05.2016
comment
Обход коллекции images документа будет более простым, чем обход коллекции all. - person Remy Lebeau; 24.05.2016
comment
Я согласен. Я забыл о коллекции изображений. Любой из них будет работать, но использование коллекции изображений будет более простым. Коллекция .all более полезна для нерегламентированного поиска. - person Dan Barclay; 24.05.2016