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

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

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

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

Задача:

Программа 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......
Объясните, пожалуйста. До всего всегда сам докапывался, а тут - прям никак!

Спасибо большое за ответы.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2011, 01:16
Ответы с готовыми решениями:

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

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

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

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

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

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

Добавлено через 10 минут
Кто подскажет (скинет кусок кода) как считать, постараюсь отблагодарить, т.к. времени данный процесс съедает много, а время как говорится - деньги . Хотелось бы автоматизировать, а вот никак не получается. Сразу уточню, что пишется не бот, а некая программка, которая поможет немного сэкономить времени на рутинных задачах.
0
21 / 21 / 7
Регистрация: 16.09.2009
Сообщений: 111
22.06.2012, 00:13 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 14
Тема более чем актуальна!
Помогите - подтолкните, куда копать?
В хроме открываю через инструменты разработчика => Network => выбираю websocket => и во вкладке Frames смотрю на пробегающие данные..
Но как сделать просмотр программно, на C# WindowsForm?! Пробую представленные выше коды - не выходит
0
4 / 4 / 2
Регистрация: 08.06.2016
Сообщений: 15
11.11.2016, 23:35 15
Я решил эту проблему при помощи совета 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
11.11.2016, 23:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2016, 23:35
Помогаю со студенческими работами здесь

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

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

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

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

парсинг содержимого ячейки
Загвоздка вот в чём есть ячейка в которой есть вот такие данные /346ххх Офигенная область...

Загрузка содержимого и парсинг
Ребята подскажите такой вопрос - в общем, не получается спарсить а точнее пошлучит данные из...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru