Парсинг с помощью mshtml - C#

Узнай цену своей работы

Формулировка задачи:

pps ошибся и не правильно назвал тему, с помощью mshtml Всем привет такой вопрос. У меня есть html страничка, которую я получаю с помощью пост запроса.
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>
мне нужно получить элементы этой таблицы и я не знаю как. Раньше делал через webbrouser и там использовал getelement by tag name
HtmlElementCollection tr = webBrowser1.Document.GetElementsByTagName("tr");
 HtmlElementCollection td = tr[i].GetElementsByTagName("th");
всё получалось, но хотелось бы без webbrouser, но в mshtml нет GetElementsByTagName.

Решение задачи: «Парсинг с помощью 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 = "Все плохо! Не нашли данный класс"


}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5