Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2012, 21:55   #1
htf
 
Регистрация: 11.05.2012
Сообщений: 4
По умолчанию как обрабатывать элементы содержимого ячеек таблицы на Web странице?

Уважаемые форумчане!
подскажите, пожалуйста: как с помощью VBA Excell корректно обрабатывать различные элементы содержимого ячеек таблицы, расположенной на Web странице?

примерный фрагмент кода:
Set oIE = CreateObject("internetexplorer.appl ication")
oIE.Navigate LINK
Do While oIE.ReadyState <> 4: loop
COUNT = oIE.Document.forms(1).all.tags("tab le").Item(1).Rows(1).Cells(1).all.L ength

‘при выполнении, программа показывает, что COUNT =7 - т.е. насколько я понимаю, в данной ячейке должно быть 7 элементов

Далее, мне необходимо считать значение элемента "output__compensation", который находится в данной ячейке (см. HTML код)
Но я не знаю, как правильно указать ссылку на данный элемент ячейки

HTML код данной ячейки следующий:
<td class="b-userlist-table-compensation"><div class="b-userlist-table-compensation-block"><span class="output__compensation">6 500 </span></div><div class="b-userlist-table-photo" onclick="return {types: ['{HHGallery2}.Gallery']}" id="rndCompId76ec35ecbca7900e"><di v onclick="return {params: {id: ''}}" class="Gallery2-Item"><a title="" class="Gallery2-Item-Link" href="/photo/395489872.jpeg?t=1347211821&amp;s=7 75b970b19d406a824b707370aaee"><img class="Gallery2-Item-Thumb" src="/photo/395489874.jpeg?t=1347211821&amp;" />[/url]</div></div><script type="text/javascript">jsx.require(['Components'], function(){jsx.Components.createCom ponents([document.getElementById('rndCompId7 6ec35ecbca7900e')])});</script></td>

Заранее большое спасибо за помощь
htf вне форума Ответить с цитированием
Старый 09.09.2012, 00:08   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Я предпочитаю такой алгоритм парсинга страницы,через счетчик можно напороться на объедененные ячейки
Код:
        For Each Table In oIE.Document.getElementsByTagName("table")
                If Table.className = "photo" Then        'Имя таблицы условное
                        allRows = Table.getElementsByTagName("tr")        'Получаем коллекцию строк
                        For Each Col In allRows.getElementsByTagName("td")        'Получаем коллекцию ячеек 
                                For Each X In Col.all  'перебираем элементы ,согласно имени получаем значение
                                        If X.className = "output__compensation" Then
                                                output__compensation = Trim(X.innerText)        'Ваше значение
                                        ElseIf X.className = "Gallery2-Item-Link" Then
                                                href = X.href        'Для примера ссылка на картинку
                                        End If
                                Next
                        Next
                End If
        Next
Еще вариант
Код:
For Each Table In WebBrowser1.Document.getElementsByTagName("table")
                If Table.className = "photo" Then        'Имя таблицы условное
                For n = 0 To Table.Rows.Length - 1
                      Set allRows = Table.Rows(n)
                        For Each Col In allRows.getElementsByTagName("td")
                                For Each X In Col.all  'перебираем элементы ,согласно имени получаем значение
                                        If X.className = "output__compensation" Then
                                                output__compensation = Trim(X.innerText)        'Ваше значение
                                        ElseIf X.className = "Gallery2-Item-Link" Then
                                                href = X.href        'Для примера ссылка на картинку
                                        End If
                                Next
                        Next
                  Next
                End If
        Next
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 09.09.2012 в 00:32.
doober вне форума Ответить с цитированием
Старый 09.09.2012, 00:51   #3
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
примерный фрагмент кода:
Set oIE = CreateObject("internetexplorer.appl ication")
oIE.Navigate LINK
Do While oIE.ReadyState <> 4: loop
COUNT = oIE.Document.forms(1).all.tags("tab le").Item(1).Rows(1).Cells(1).all .L ength
чтобы загрузить страницу, не обязательно использовать браузер (напрямую) - http://www.excelworld.ru/forum/3-2168-1

Цитата:
Я предпочитаю такой алгоритм парсинга страницы,через счетчик можно напороться на объедененные ячейки
так уже не модно ) Там только два нормальных метода: по тегу и по айди. Проще парсить через javascript/jscript (полторы строки, если подключена нужная библиотека. А на большинстве сайтов она уже подключена) )

Для тех, кому не чужды скриптовые языки - ScriptControl
Тишина – самый громкий звук

Последний раз редактировалось nerv; 09.09.2012 в 01:14.
nerv вне форума Ответить с цитированием
Старый 09.09.2012, 01:18   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А не проще ли средствами Excel создать веб-запрос, и работать с ячейками уже в Excel?
(такой запрос можно и макросом создать)

Не всегда, конечно, это помогает, но очень часто позволяет обойтись без парсинга HTML
EducatedFool вне форума Ответить с цитированием
Старый 09.09.2012, 01:59   #5
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

пример слепил : )

Код:
Sub io()
    
    With New HTTP
        ' получаем страницу
        Set html = .getHTML("http://programmersforum.ru/showthread.php?t=211210")
    End With
    
    ' подключаем к ней либу : )
    html.write ("<script src=""http://code.jquery.com/jquery-1.8.1.min.js""></script>")
    
    ' пишем код на javascript
    html.write "<script>alert( $( 'td[class=""navbar""]' ).text() );</script>"

End Sub
Вложения
Тип файла: zip test.zip (14.3 Кб, 34 просмотров)
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 09.09.2012, 15:31   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

nerv, код очень интересный, но что он делает?
Я с javascript не дружу, поэтому не совсем понимаю, что должно произойти при выполнении этого кода.

Я запустил макрос из файла-примера - с виду, ничего не произошло.
EducatedFool вне форума Ответить с цитированием
Старый 09.09.2012, 18:25   #7
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Кросс. http://www.cyberforum.ru/vba/thread648780.html
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 09.09.2012, 19:05   #8
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

EducatedFool, по идее должно показываться название темы в диалоговом окне. Можешь попробовать еще раз?

Вопрос к форумчанам: у кого еще не работает код?

Если уж заговорил об "интересностях":
- получение количества измерений массива
- создание объекта "на ходу" без модуля класса
- модификация созданного объекта: добавление/удаление свойств (опять-таки "на ходу")

kuklp, спс. Мне "на интерес", а не на результат )
Тишина – самый громкий звук

Последний раз редактировалось nerv; 09.09.2012 в 19:09.
nerv вне форума Ответить с цитированием
Старый 09.09.2012, 21:52   #9
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Александр, первый раз запустил .... ничего, в пошаговом вывело сообщение с названием темы, потом нормально выводило, возможно таймаута не хватает.
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 09.09.2012, 23:42   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
EducatedFool, по идее должно показываться название темы в диалоговом окне. Можешь попробовать еще раз?
Ну попробовал.
Результат, разумеется, тот же (3 секунды думает, ничего не происходит)
Если файл для тестирования тот же - что может измениться?
Запускал как из VBE, так и с кнопки на листе. Да и вообще, запускать макросы я умею)

Видимо, чем-то настройки моей системы отличаются от твоей
(у меня WinXP 32бит, IE7, браузер по умолчанию - Chrome, во всех браузерах все скрипты разрешены)
Да и вообще, у меня все макросы всегда работают) Так что, видимо, код не очень универсальный.

(добавлено позже)
прочитал коммент R Dmitry, тоже попробовал в пошаговом режиме, - заработало.

Цитата:
Если уж заговорил об "интересностях":
Круто! Респект!
Не ожидал, что можно делать подобное в VBA.

По-любому бы нашел, где эти возможности применить в своих макросах,
но, увы, с возможностями js не знаком, поэтому пользы от применения пока будет мало.
Впрочем, пока со всем справляюсь возможностями VBA (c модулями классов),
а изучать js - пока времени нет.

Последний раз редактировалось EducatedFool; 09.09.2012 в 23:46.
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изображение как фон одной из ячеек таблицы rmv240899 HTML и CSS 1 07.08.2012 20:41
Удаление содержимого ячеек spirit-ua Microsoft Office Excel 3 22.06.2011 08:13
Защита содержимого ячеек от изменении roborrr Microsoft Office Excel 5 25.04.2011 13:11
Как удалить элементы таблицы в RichEdit? artemavd Общие вопросы Delphi 3 10.04.2011 19:31
Как импортировать в MySql таблицы из web? NurNet Общие вопросы .NET 1 19.08.2009 09:37