Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/47: Рейтинг темы: голосов - 47, средняя оценка - 4.89
miathe

Парсинг содержимого iframe

11.02.2011, 01:16. Показов 10009. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Решение ищу уже довольно долго. На этом форуме есть похожие темы, но они немного не подходят.

Задача:

Программа c# загружает страницу сайта site1.com, на которой, помимо прочего, расположен iframe с некоторыми данными. Так вот эти самые данные нужно оттуда программно "достать" и обработать.

Проблема и условия:

1. В указанный iframe данные загружаются автоматически с сайта site2.com, то есть на загружаемой страничке есть код:
<iframe src="site2.com/stuff..."></iframe>

2. Через запрос по адресу, указанному в src, данные не достать, там какая-то хитрая внутри система javascript'ов и черт знает чего еще.

3. Если страницу загружать с помощью компонента WebBrowser, в нем все отлично отображается, однако с помощью WebBrowser.DocumentText ничего не достать, естественно.

Вопрос:

Как достать данные из iframe? Я пробовал по-разному через WebBrowser.Document, даже пытался что-то сделать с помощью mshtml, - ни в какую! Мне не хватает знаний, я не понимаю, где лежит то, что реально отображается в WebBrowser?. Он ведь уже все отображает, все внутренности, как до них докопаться? На сколько я понимаю, где-то, в каком-то свойстве лежит DOM уже готовой, загруженной странички, в которой уже выполнены все скрипты и загружены все картинки и т.п. Или его можно как-то получить. Но я путаюсь в окнах, фреймах и приведениях. Я уже писал "монстроподобные" цепочки типа

C#
1
HTMLFrameBase frame = myWebBrowser.Document.GetElementsByTagName("IFrame")[0].DomElement as HTMLFrameBase;
Или совсем уже извращенные на подобие

C#
1
myWebBrowser.Document.Window.Document.Window......
Объясните, пожалуйста. До всего всегда сам докапывался, а тут - прям никак!

Спасибо большое за ответы.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2011, 01:16
Ответы с готовыми решениями:

Парсинг содержимого сайта с протоколом https
Всем привет. Пытаюсь распарсить содержимое сайта (например, объявлений) с протоколом https. Приложение написал, все парсится, но...

Парсинг содержимого iframe
Всем привет, случилась такая проблема. Получил баннер от рекламодателя сторонним скриптом, хочу его роспарсить чтобы получить прямую...

Перезапись содержимого iframe
Имеется код, который обеспечивает отправку при загрузке страницы формы на сервер и получение ответа в iframe, но почему-то не в состоянии...

14
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 3
15.02.2011, 15:45
тоже интересен этот момент.
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
15.03.2011, 11:40
любой элемент из веббраузера извлекается с помощью getelementsbytagname(), причем он извлекает эти элементы со всех уровней вложенности, если получился какой то массив элементов на выходе этого метода то чтобы получить нужный элемент придеться видимо посмотреть его содержимое либо родительские узлы.
0
3 / 3 / 2
Регистрация: 12.03.2011
Сообщений: 11
16.03.2011, 16:35
Code
1
2
3
4
IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
int index = 1; \\номер фремйа который парсим
IHTMLWindow2 frame = (IHTMLWindow2)doc.frames.item(index);
string content = frame.document.body.innerHTML;
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
16.03.2011, 17:21
C#
1
2
HtmlelementCollection collection=myWebBrowser.Document.GetElementsByTagName("IFrame");
HtmlElement collection_item=collection[index];
не проверял с фреймами но с другими отлично работет тэгами, единственное условие нужно было дождаться окончательной загрузки страницы, потому что фреймы вроде бы заставлют свойство загрузки выполняться несоклько раз.
0
3 / 3 / 2
Регистрация: 12.03.2011
Сообщений: 11
16.03.2011, 21:28
Цитата Сообщение от asd321 Посмотреть сообщение
C#
1
2
HtmlelementCollection collection=myWebBrowser.Document.GetElementsByTagName("IFrame");
HtmlElement collection_item=collection[index];
не проверял с фреймами но с другими отлично работет тэгами, единственное условие нужно было дождаться окончательной загрузки страницы, потому что фреймы вроде бы заставлют свойство загрузки выполняться несоклько раз.
такое точно не пройдет, если фреймы генерируются с помощью js
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
17.03.2011, 12:12
Цитата Сообщение от Quiet as ice Посмотреть сообщение
такое точно не пройдет, если фреймы генерируются с помощью js
разве они в штмл коде загруженной страницы после генерации не присутствуют?
0
3 / 3 / 2
Регистрация: 12.03.2011
Сообщений: 11
20.03.2011, 14:40
Цитата Сообщение от asd321 Посмотреть сообщение
разве они в штмл коде загруженной страницы после генерации не присутствуют?
не-а, только вызов функции и все.
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
19.04.2011, 14:30
Цитата Сообщение от Quiet as ice Посмотреть сообщение
Code
1
2
3
4
IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
int index = 1; \\номер фремйа который парсим
IHTMLWindow2 frame = (IHTMLWindow2)doc.frames.item(index);
string content = frame.document.body.innerHTML;
а тип IHTMLDocument2 из бибилиотеки mshtml?
и еще а нельзя ли получить сразу HtmlElementCollection фрейма?

Добавлено через 19 часов 11 минут
кароче вот вариант без использования mshtml - гораздо удобнее мне кажется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
   HtmlWindow hw = webBrowser1.Document.Window;
                if (hw.Frames.Count > 0)
                {
                    HtmlElementCollection[] htel = new HtmlElementCollection[hw.Frames.Count];
                    int counter=0;
                    foreach (HtmlWindow hwel in hw.Frames)
                    {
                        //добавим в коллекцию все таблицы
                        htel[counter] = hwel.Document.Body.GetElementsByTagName("table");
                        counter++;
                    }
                    tec = htel[0];
                }
Добавлено через 6 минут
ВОТ У МЕНЯ ВОПРОС! возможно ли изменить содержимое загруженного фрейма, потому что я пытался изменить бгкалор какой либо ячейки и у меня не получилось, если возможно то как? приведите пример, или измененеие его содержимого не отличается от изменения содержимого html документа без фреймов?

Добавлено через 23 часа 6 минут
Цитата Сообщение от asd321 Посмотреть сообщение
а тип IHTMLDocument2 из бибилиотеки mshtml?
и еще а нельзя ли получить сразу HtmlElementCollection фрейма?

Добавлено через 19 часов 11 минут
кароче вот вариант без использования mshtml - гораздо удобнее мне кажется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
   HtmlWindow hw = webBrowser1.Document.Window;
                if (hw.Frames.Count > 0)
                {
                    HtmlElementCollection[] htel = new HtmlElementCollection[hw.Frames.Count];
                    int counter=0;
                    foreach (HtmlWindow hwel in hw.Frames)
                    {
                        //добавим в коллекцию все таблицы
                        htel[counter] = hwel.Document.Body.GetElementsByTagName("table");
                        counter++;
                    }
                    tec = htel[0];
                }
Добавлено через 6 минут
ВОТ У МЕНЯ ВОПРОС! возможно ли изменить содержимое загруженного фрейма, потому что я пытался изменить бгкалор какой либо ячейки и у меня не получилось, если возможно то как? приведите пример, или измененеие его содержимого не отличается от изменения содержимого html документа без фреймов?
вопрос отпадает -конечно же можно, просто нельзя изменить те атрибуты и параметры которые перекрываются описанием класса, чтобы изменить класс нужно будет обработать css код, он вроде может быть как в штмл так и отдельно а фрейм будет ссылаться на него линком. Тоесть нужно будет считать цсску и переписать ее как нужно с изменением соответствующих атрибутов.
0
0 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 6
12.05.2012, 21:07
Ребят, у меня тоже актуальна данная задачка. Выводу окно, ссылка открывается, но доступ не получить. Можно ли все-таки как-то загрузить то, что отобразилось куда-то, а потом распарсить. Мне не нужно ничего менять, т.е. при чем тут безопасность.
В качестве моей задачи, хочу автоматизировать одну вещицу, которую надоело делать. В ВК открывается по прямой ссылке приложение и нужно выцепить из него все id, но не пойму как это сделать. Пробовал прямой ссылкой, в таком случае iframe пустой открывается, т.е. есть завязка на ВК.

Может кто сталкивался примерно с такой задачей и есть маленький пример.
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
12.05.2012, 21:43
sergboro, что за приложение дай ссылку, поковыряюсь
0
0 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 6
23.05.2012, 13:08
Цитата Сообщение от anonimus Посмотреть сообщение
sergboro, что за приложение дай ссылку, поковыряюсь
Приветствую, приложение Pro Football, http://vk.com/app2201894?union=108759204 вот как пример, прямая ссылка, которая открывает состав, но вот хоть ты тресни не получается считать. Уже все перепробовал, я в прострации. Правда на пару дней задачку отложил, т.к. по работе был занят.

Добавлено через 10 минут
Кто подскажет (скинет кусок кода) как считать, постараюсь отблагодарить, т.к. времени данный процесс съедает много, а время как говорится - деньги . Хотелось бы автоматизировать, а вот никак не получается. Сразу уточню, что пишется не бот, а некая программка, которая поможет немного сэкономить времени на рутинных задачах.
0
21 / 21 / 7
Регистрация: 16.09.2009
Сообщений: 111
22.06.2012, 00:13
Топик наверно уже не актуален, но в будущем возможно кому нибудь пригодиться)
Я столкнулся с такой же проблемой (мне нужно получить фрейм вложенный во фрейм, который методом GetElementsByTagName("iframe") не достаётся) и попробывал использовать код asd321, но он не сработал, т.к.:
htel[counter] = hwel.Document.Body.GetElementsByTagName( "iframe")
не возвращала никаких фреймов, всмысле каждый раз htel.Count был равен 0.
Я продолжил копать в сторону HtmlWindow.Frames , и вот что получилось
C#
1
2
3
4
5
6
7
8
HtmlWindowCollection topLevelFrames = webBrowser1.Document.Window.Frames;
HtmlWindowCollection[] secondLevelFrames;
if (topLevelFrames.Count > 0)
{
    secondLevelFrames = new HtmlWindowCollection[topLevelFrames.Count];
    for (int i = 0; i < topLevelFrames.Count; i++)
        secondLevelFrames[i] = topLevelFrames[i].Frames;
}
В случае, если в каком то из фреймов будут вложенные фреймы, htel.Count будет соответствовать их количеству, и тогда обращаться к фреймам можно так: secondLevelFrames[i][j], где i-номер фрейма верхнего уровня, j-номер фрейма вложенного уровня, ну и получается так, что фрейм будет не как HtmlElement, а как HtmlWindow, думаю это не столь важно...
0
8 / 8 / 4
Регистрация: 09.10.2015
Сообщений: 37
12.03.2016, 15:52
Тема более чем актуальна!
Помогите - подтолкните, куда копать?
В хроме открываю через инструменты разработчика => Network => выбираю websocket => и во вкладке Frames смотрю на пробегающие данные..
Но как сделать просмотр программно, на C# WindowsForm?! Пробую представленные выше коды - не выходит
0
4 / 4 / 2
Регистрация: 08.06.2016
Сообщений: 15
11.11.2016, 23:35
Я решил эту проблему при помощи совета krzdezda
Получение текущего HTML кода страницы из WebBrowser

C#
1
2
3
4
5
6
7
8
9
10
11
if ( webBrowser1.Document == null )
{
    return;
}
HtmlElementCollection elements = webBrowser1.Document.GetElementsByTagName( "HTML" );
if ( elements.Count == 1 )
{
    var htmlElement = elements[ 0 ];
    string pageSource = htmlElement.OuterHtml;
    File.WriteAllText( "C:\\code.html", pageSource );
}
Строку вывод в файл можно убрать и отработать текст из переменной pageSource
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.11.2016, 23:35
Помогаю со студенческими работами здесь

Изменение содержимого iframe
Приветствую всех. В общем суть вопроса такова... Как &quot;кастрировать страничку&quot;? Существует множество дополнений для браузера (для...

Как достучаться до содержимого iframe?
Древовидная структура. Есть php, генерирующая 1 ветвь дерева. Для того, чтоб отображать/открывать нужные ветви я их первоначально гружу...

Автоматическая смена содержимого iframe
Возможно ли сделать следующее:есть блок в котором выводится видео добавленное через iframe. Можно ли сделать так, чтоб в этом блоке...

Изменить размер iframe из кода содержимого
Возможно ли так делать в последних версиях браузеров и как?

Парсинг содержимого файла
Доброго времени, уважаемые форумчане. Возникла такая задача: написать программу( или скрипт) которая на сайте подгружает файл повтора...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru