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