Парсинг с помощью mshtml - C#
Формулировка задачи:
pps ошибся и не правильно назвал тему, с помощью mshtml
Всем привет такой вопрос. У меня есть html страничка, которую я получаю с помощью пост запроса.
В ней есть некоторая таблица, часть
мне нужно получить элементы этой таблицы и я не знаю как. Раньше делал через webbrouser и там использовал getelement by tag name
всё получалось, но хотелось бы без webbrouser, но в mshtml нет GetElementsByTagName.
string html = " <body>......</body>"; mshtml.IHTMLDocument2 doc = new mshtml.HTMLDocumentClass(); doc.write(html);
<tr> <th width="30"> <a href="#" tabindex="6">5</a> </th> <th width="30"> <a class="over_lib" style="cursor: pointer;"> <img src="skins/xnova-evolution-plus/planeten/small/s_dschjungelplanet09.jpg" height="30" width="30"> </a> </th> <th style="white-space: nowrap;" width="130"> <font color="red">2ва</font> </th> <th style="white-space: nowrap;" width="30"> <a class="over_lib" style="cursor: pointer;"> <img src="skins/xnova-evolution-plus/planeten/small/s_mond.jpg" height="30" width="30"> </a> </th> <th style="white-space: nowrap;" width="30"></th> <th width="150"> <a class="over_lib" style="cursor: pointer;" href="options.php"> _2-D_ </a> </th> <th width="80"> <a class="over_lib" style="cursor: pointer;"> <span class="allymember">Garfield</span> </a> </th> <th style="white-space: nowrap;" width="125"></th> </tr>
HtmlElementCollection tr = webBrowser1.Document.GetElementsByTagName("tr"); HtmlElementCollection td = tr[i].GetElementsByTagName("th");
Решение задачи: «Парсинг с помощью mshtml»
textual
Листинг программы
................. ................. ................. using mshtml; private void Parse() { HTMLDocument doc; //Класс IHTMLDocument2 doc2; //Интерфейс второго уровня IHTMLDocument3 doc3; //Интерфейс третьего уровня - не поленитесь почитайте что за уровни? //и как их препарировать string s = ""; //куда будем складывать данные //Допустим мы где-то достали HTML страничку и поместили ее в переменную html string html = "<html __expr-val-dir='ltr' dir='tr'> <body class='body' scroll='yes' onload='javascript:_spBodyOnLoadWrapper();'> <div id='someid' style='width: auto'> <div class='resultS'> <h1> Результаты поиска </h1> </div> <div class='forms resultSearchTable' style='width: auto'> <table class='resultsINN columnsAuto' style='width: 100%!important; table-layout:auto'> <col width='15' /> <col width='90' /> <col width='25' /> <col width='55' /> <col width='80' /> <col width='80' /> <col width='60' /> <col width='60' /> <col width='80' /> <col width='130' /> <thead> <tr> <td style='vertical-align: middle'> № </td> <td style='vertical-align: middle'> Наименование </td> <td style='vertical-align: middle'> Тип </td> <td style='vertical-align: middle'> Резидент </td> <td style='vertical-align: middle'> ИНН </td> <td style='vertical-align: middle'> БИН </td> <td style='vertical-align: middle'> Дата гос. регистрации </td> <td style='vertical-align: middle'> Дата снятия с учёта </td> <td style='vertical-align: middle'> Причина снятия с учёта </td> <td style='vertical-align: middle'> Дополнительные сведения </td> </tr> </thead> <tbody> <tr> <td class="complKnowlege" style="vertical-align:middle;"> 1 </td> <td class="complKnowlege" style="vertical-align:middle;"> ШЕВЕЛЕВА ОКСАНА ЮРЬЕВНА </td> <td style="vertical-align:middle;"> ФЛ </td> <td style="vertical-align:middle;"> Да </td> <td style="vertical-align:middle;"> 600412066086 </td> <td style="vertical-align:middle;"> 771125400672 </td> <td style="vertical-align:middle;"> 31.08.2000 </td> <td style="vertical-align:middle;"> </td> <td class="complKnowlege" style="vertical-align:middle;"> </td> <td class="complKnowlege" style="vertical-align:middle;"> </td> </tr> </tbody> </table> </div> </div> </body> </html>"; //Нам позарез захотелось вытащить индивидуальные данные прекрасной дамы (тут она ОКСАНА ЮРЬЕВНА) //первое что приходит в голову есть элемент div с id = "someid", который включает все остальные //элементы //И так поехали doc = new HTMLDocument(); //создаем элемент doc на прямую к классу HTMLDocumentClass //нам доступ закрыт doc2 = (IHTMLDocument2)doc; //Инициализируем интерфейс 2 го уровня doc2.write(html ); //передаем интерфейсу наш документ //Мы бы могли не трах..ься, а использовать сразу doc класс но тогда мы не выделим нужные нам объекты //Если не верите попробуйте сами выделить нужные вам объекты IHTMLElement div = doc3.getElementById("someid"); //вычленяем наш элементик if (div != null) { //если он не null IHTMLElementCollection el = div.children; //в el передаем все дочерние элементы foreach (IHTMLElement ff in el) { if (ff.className == "forms resultSearchTable") // тутачки выделяем класс элемента, //а именно наш 2 ой div элемент { IHTMLElementCollection el2 = ff.all; //в el2 кладем все элементы div foreach (IHTMLElement ff2 in el2) { if (ff2 is mshtml.HTMLTable){ //проверяем если в этом элементе есть таблица //хотя могли воспользоваться свойством className //но мы из принципа пройдем весь путь дальше IHTMLElementCollection el3 = ff2.all; //в el3 кладем все элементы уже нашей таблицы foreach (IHTMLElement ff3 in el3) { if (ff3 is mshtml.HTMLTableSection) //если этот элемент одна из //секций таблицы <TBODY> или <THEAD> { //здесь бы мы могли вставить фильтр типа if (ff3.TagName == "TBODY") //но не будем этого делать IHTMLElementCollection el4 = ff3.all; //выделяем все элементы таблички foreach (IHTMLElement ff4 in el4) { if (ff4 is mshtml.HTMLTableRow) //проверяем, //а выделенные элементы суть стоки? { IHTMLElementCollection el5 = ff4.all; foreach (IHTMLElement ff5 in el5) { s+ = ff5.innerText +"\t"; } } } } } } } } } } else s = "Все плохо! Не нашли данный класс" }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д