【问题标题】:Parsing HTML using HTTP Agility Pack使用 HTTP Agility Pack 解析 HTML
【发布时间】:2010-03-29 11:57:14
【问题描述】:

这是五张桌子中的一张:

<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();

是否可以合并这两个查询? 我将如何将其转换为 lambda 表达式? 我刚开始学习这些东西,我想知道它是如何完成的,这样我以后就不会再有这些问题了。

哦,还有一个问题...有人知道任何图形控件吗,因为我必须在图形中显示这些值。 我从 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);

我的第一个帖子有很多问题......呵呵,希望我不是模糊不清或什么的。 感谢您的回复!

【问题讨论】:

    标签: c# html-agility-pack


    【解决方案1】:

    对于此类 CodePlex 项目,请考虑将您的问题直接发布到他们的讨论板上。通常这是联系开发人员的最佳方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2014-07-13
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多