Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
DNLHC
1 / 1 / 2
Регистрация: 12.12.2012
Сообщений: 26
1

Парсинг тегов <title> расположенных в разных формах

12.12.2012, 22:00. Просмотров 1088. Ответов 5
Метки нет (Все метки)

есть страница на которой большое количество форм, и мне нужно пробежаться по каждой форме и вытащить значение тега <Title> с каждой формы.
Буду благодарен за помощь \ пример, с данной темой сталкиваюсь в первые
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2012, 22:00
Ответы с готовыми решениями:

Переменные в разных формах
Добрый день, уважаемые программисты. Мне нужна помощь в коде программы. А...

Переменные в разных формах
Нужно ли прописывать переменные заново в новой форме, если они заведены уже в...

Парсинг одинаковых тегов в разные поля
У меня такая проблема. Есть страница, в ней есть одинаковые теги, но информация...

Повторение объектов на разных формах
Всем привет. В программе имеется несколько форм, в которых имеется один и тот...

Один компонент на разных формах
Доброго времени суток! Создаю программу считывания показаний датчиков через OPC...

5
cotseec
Пишу на Delphi...иногда
1408 / 1267 / 285
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
12.12.2012, 22:07 2
Document Object Model
0
DNLHC
1 / 1 / 2
Регистрация: 12.12.2012
Сообщений: 26
13.12.2012, 01:28  [ТС] 3
я уже примерно ознакомился

получилось вот что:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button1Click(Sender: TObject);
var a, title, form:  variant;
i,j:integer;
begin
form:=webbrowser1.OleObject.document.Forms;
for j := 0 to form.length - 1 do
  begin
  title:=webbrowser1.OleObject.document.GetElementsByTagName('title');
  for i := 0 to title.length -1 do
    begin
    a:=title.item(i);
    memo1.Lines.Add(a.InnerText);
    end;
  end;
end;
но вот беда, выводит он совсем не то что мне нужно

Добавлено через 6 минут
вроде бы сообразил в чем проблема
в том что теги <title> расположены не в формах, а между ними
HTML5
1
2
3
4
5
6
7
        <div class="tradepoll">
            <div class="tradeheader" title="Значение">
                 <a href="trade?t=290958">
                <span class="user"><b>mzpcrvwv</b></span>
                wants to trade: (5 seconds ago)</a>
                 
            </div>
вот собственно кусок кода страницы, который расположен между формами, и нужно отсюда вытащить значение <title>
вытекает вопрос, за что мне цепляться?

Добавлено через 2 часа 52 минуты
и все же?
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
13.12.2012, 05:10 4
Здесь надо искать по имени тега: "div", имени класса: "tradeheader" и по имени атрибута: "title". Атрибут "title" есть во всех DOM элементах, поэтому, если он даже в HTML коде не указан, то всё равно он присутствует. В этом случае можно делать проверку - отсеивать те элементы, у которых атрибут "title" имеет значение, равное пустой строке.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//Поиск элементов с заданными параметрами.
procedure TForm1.Button1Click(Sender: TObject);
var
  Doc, Elems, Elem, Attrs, Attr : Variant;
  TagName, ClassName, AttrName, AttrVal : String;
  i, j, Cnt : Integer;
begin
  //Ссылка на документ.
  Doc := WebBrowser1.OleObject.document;
  if TVarData(Doc).VDispatch = nil then begin
    ShowMessage('Документ не задан. Действие отменено.');
    Exit;
  end;
  //TagName = 'div'.
  TagName := Edit1.Text;
  if TagName = '' then begin
    ShowMessage('Тег не задан. Действие отменено.');
    Exit;
  end;
  //ClassName = 'tradeheader'.
  ClassName := Edit2.Text;
  if ClassName = '' then begin
    ShowMessage('Имя класса не задано. Действие отменено.');
    Exit;
  end;
  //AttrName = 'title'.
  AttrName := Edit3.Text;
  if AttrName = '' then begin
    ShowMessage('Имя атрибута не задано. Действие отменено.');
    Exit;
  end;
 
  Memo1.Lines.Add('--------------------------------------------------');
  Memo1.Lines.Add('Tag: "' + TagName + '", ClassName: "' + ClassName
     + '", AttrName: "' + AttrName + '".');
 
  //Получаем коллекцию всех элементов с заданным тегом.
  Elems := Doc.getElementsByTagName(TagName);
  //Перебор всех элементов колекции.
  Cnt := 0;
  for i := 0 to Elems.length - 1 do begin
    //Ссылка на очередной элемент.
    Elem := Elems.item(i);
    //Проверяем имя класса.
    if Elem.className = ClassName then begin
      //Поиск атрибута.
      //Почему-то в интерфейсе нет методов Elem.hasAttribute()
      //и Elem.getAttribute(). Поэтому пришлось сделать перебор атрибутов.
      Attrs := Elem.Attributes;
      for j := 0 to Attrs.length - 1 do begin
        Attr := Attrs.item(j);
        if Attr.name = AttrName then begin
          AttrVal := Attr.value;
          //Например, атрибут title есть у всех элементов DOM, поэтому, даже если
          //этот атрибут не задан в явном виде в HTML коде, то он всё равно
          //присутствует. И его значение в этом случае равно пустой строке.
          if AttrVal <> '' then begin
            Inc(Cnt);
            Memo1.Lines.Add(IntToStr(Cnt) + ': ' + AttrName + ' = "' + AttrVal + '".');
          end;
        end;
      end;
    end;
  end;
  Memo1.Lines.Add('Всего найдено элементов: ' + IntToStr(Cnt) + '.');
end;
1
Alex_pac
1293 / 699 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
13.12.2012, 09:47 5
jsWebbrowser

Delphi
1
2
3
4
5
6
7
8
9
var h: Helems; i:integer;
begin
  // используем memo   
  Memo1.clear;
  Webbrowser1.getElementsByClassName('div','tradeheader', h);
   for i:=0 to high(h) do begin
     Memo1.lines.add(h.getAttribute('title',0));
   end;
end;
1
DNLHC
1 / 1 / 2
Регистрация: 12.12.2012
Сообщений: 26
13.12.2012, 10:20  [ТС] 6
Цитата Сообщение от Mawrat Посмотреть сообщение
Здесь надо искать по имени тега: "div", имени класса: "tradeheader" и по имени атрибута: "title". Атрибут "title" есть во всех DOM элементах, поэтому, если он даже в HTML коде не указан, то всё равно он присутствует. В этом случае можно делать проверку - отсеивать те элементы, у которых атрибут "title" имеет значение, равное пустой строке.
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//Поиск элементов с заданными параметрами.
procedure TForm1.Button1Click(Sender: TObject);
var
  Doc, Elems, Elem, Attrs, Attr : Variant;
  TagName, ClassName, AttrName, AttrVal : String;
  i, j, Cnt : Integer;
begin
  //Ссылка на документ.
  Doc := WebBrowser1.OleObject.document;
  if TVarData(Doc).VDispatch = nil then begin
    ShowMessage('Документ не задан. Действие отменено.');
    Exit;
  end;
  //TagName = 'div'.
  TagName := Edit1.Text;
  if TagName = '' then begin
    ShowMessage('Тег не задан. Действие отменено.');
    Exit;
  end;
  //ClassName = 'tradeheader'.
  ClassName := Edit2.Text;
  if ClassName = '' then begin
    ShowMessage('Имя класса не задано. Действие отменено.');
    Exit;
  end;
  //AttrName = 'title'.
  AttrName := Edit3.Text;
  if AttrName = '' then begin
    ShowMessage('Имя атрибута не задано. Действие отменено.');
    Exit;
  end;
 
  Memo1.Lines.Add('--------------------------------------------------');
  Memo1.Lines.Add('Tag: "' + TagName + '", ClassName: "' + ClassName
     + '", AttrName: "' + AttrName + '".');
 
  //Получаем коллекцию всех элементов с заданным тегом.
  Elems := Doc.getElementsByTagName(TagName);
  //Перебор всех элементов колекции.
  Cnt := 0;
  for i := 0 to Elems.length - 1 do begin
    //Ссылка на очередной элемент.
    Elem := Elems.item(i);
    //Проверяем имя класса.
    if Elem.className = ClassName then begin
      //Поиск атрибута.
      //Почему-то в интерфейсе нет методов Elem.hasAttribute()
      //и Elem.getAttribute(). Поэтому пришлось сделать перебор атрибутов.
      Attrs := Elem.Attributes;
      for j := 0 to Attrs.length - 1 do begin
        Attr := Attrs.item(j);
        if Attr.name = AttrName then begin
          AttrVal := Attr.value;
          //Например, атрибут title есть у всех элементов DOM, поэтому, даже если
          //этот атрибут не задан в явном виде в HTML коде, то он всё равно
          //присутствует. И его значение в этом случае равно пустой строке.
          if AttrVal <> '' then begin
            Inc(Cnt);
            Memo1.Lines.Add(IntToStr(Cnt) + ': ' + AttrName + ' = "' + AttrVal + '".');
          end;
        end;
      end;
    end;
  end;
  Memo1.Lines.Add('Всего найдено элементов: ' + IntToStr(Cnt) + '.');
end;
спасибо большое, всё работает
0
13.12.2012, 10:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 10:20

Обработка компонентов одной процедурой на разных формах
Доброго времени суток. На форме есть несколько однотипных компонентов...

Зависимость двух таблиц stringgrid на 2 разных формах
Как сделать так,что при внесении данных в первую таблицу(находящуюся на 1...

Обмен данными между массивами, описанными в разных формах
Приветствую коллеги, есть массив формы 1 и массив формы 2. Имена массивов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru