Разбор HTML с использованием HTTP Agility Pack - PullRequest
0 голосов
/ 29 марта 2010

Вот одна таблица из 5:

<h3>marec - maj 2009</h3>
<div class="graf_table">
<table summary="layout table">
    <tr>
        <th>DATUM</th>
        <td class="datum">10.03.2009</td>
        <td class="datum">24.03.2009</td>
        <td class="datum">07.04.2009</td>
        <td class="datum">21.04.2009</td>
        <td class="datum">05.05.2009</td>
        <td class="datum">06.05.2009</td>
    </tr>
    <tr>
        <th>Maloprodajna cena [EUR/L]</th>
        <td>0,96000</td>
        <td>0,97000</td>
        <td>0,99600</td>
        <td>1,00800</td>
        <td>1,00800</td>
        <td>1,01000</td>
    </tr>
    <tr>
        <th>Maloprodajna cena [SIT/L]</th>
        <td>230,054</td>
        <td>232,451</td>
        <td>238,681</td>
        <td>241,557</td>
        <td>241,557</td>
        <td>242,036</td>
    </tr>
    <tr>
        <th>Prodajna cena brez dajatev</th>
        <td>0,33795</td>
        <td>0,34628</td>
        <td>0,36795</td>
        <td>0,37795</td>
        <td>0,37795</td>
        <td>0,37962</td>
    </tr>
    <tr>
        <th>Trošarina</th>
        <td>0,46205</td>
        <td>0,46205</td>
        <td>0,46205</td>
        <td>0,46205</td>
        <td>0,46205</td>
        <td>0,46205</td>
    </tr>
    <tr>
        <th>DDV</th>
        <td>0,16000</td>
        <td>0,16167</td>
        <td>0,16600</td>
        <td>0,16800</td>
        <td>0,16800</td>
        <td>0,16833</td>
    </tr>
</table>
</div>

Я должен извлечь значения, где заголовок таблицы - DATUM и Maloprodajna cena [EUR / L]. Я использую пакет Agility HTML.

this.htmlDoc = new HtmlAgilityPack.HtmlDocument();
this.htmlDoc.OptionCheckSyntax = true;
this.htmlDoc.OptionFixNestedTags = true;
this.htmlDoc.OptionAutoCloseOnEnd = true;
this.htmlDoc.OptionOutputAsXml = true; // is this necessary ??
this.htmlDoc.OptionDefaultStreamEncoding = System.Text.Encoding.Default;

У меня было много проблем с получением этих ценностей. Я начал с:

 var query = from html in doc.DocumentNode.SelectNodes("//div[@class='graf_table']").Cast<HtmlNode>()
 from table in html.SelectNodes("//table").Cast<HtmlNode>()
 from row in table.SelectNodes("tr").Cast<HtmlNode>()
 from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
 select new { Table = table.Id, CellText = cell.InnerHtml };

но не смог найти способ выбрать только те значения, в которых заголовок таблицы - DATUM и Maloprodajna cena [EUR / L]. Можно ли это сделать с помощью предложения where?

Тогда я закончил с этими двумя запросами:

var date = (from d in htmlDoc.DocumentNode.SelectNodes("//div[@class='graf_table']//table//tr[1]/td")
                    select DateTime.Parse(d.InnerText)).ToArray();

var price = (from p in htmlDoc.DocumentNode.SelectNodes("//div[@class='graf_table']//table//tr[2]/td")
                     select double.Parse(p.InnerText)).ToArray();

Можно ли объединить эти два запроса? И как мне преобразовать это в лямбда-выражение? Я только начал изучать эти вещи, и я хотел бы знать, как это делается, чтобы в будущем у меня не было этих вопросов.

О, еще один вопрос ... кто-нибудь знает какой-либо элемент управления графом, потому что я должен показать эти значения в графе. Я начал с Microsoft Chart Controls, но у меня проблемы с его настройкой. Так что, если у кого-то есть опыт работы с ним, я хотел бы знать, как его установить, чтобы ось x показала все значения не каждую секунду ... пример: если у меня есть: 10.03.2009, 24.03.2009, 07.04.2009, 21.04.2009, 05.05.2009, 06.05.2009 показывать только: 10.03.2009, 07.04.2009, 05.05.2009, пр.

Я привязываю данные к графику так:

chart1.Series["Series1"].Points.DataBindXY(date, price);

У меня много вопросов для моего первого поста ... хе-хе, надеюсь, что я не был невнятным или что-то в этом роде. Спасибо за любой ответ!

1 Ответ

0 голосов
/ 30 марта 2010

Для таких проектов CodePlex рассмотрите возможность размещения своих вопросов непосредственно на их форумах. Обычно это лучший способ связаться с разработчиками.

...