从HTMLAgiltyPack解析结果

时间:2013-05-04 12:57:54

标签: c# html-agility-pack

我正在尝试解析Yahoo Finance页面以获取股票代码和公司名称列表。我正在使用的网址是:http://uk.finance.yahoo.com/q/cp?s=%5EFTSE

我正在使用的代码是;

HtmlAgilityPack.HtmlDocument page = new HtmlWeb().Load("http://uk.finance.yahoo.com/q/cp?s=%5EFTSE");

        var titles = page.DocumentNode.SelectNodes("//td[@class='yfnc_tabledata1']");
    // Returns all titles on the home page of this site in an array.

        foreach (var title in titles)
        {
            txtLog.AppendText(title.InnerHtml + System.Environment.NewLine);

        }

txtLog.AppendText行只是我测试。代码正确地获取了包含td节点下的yfnc_tabledata1类的每一行。现在,当我在foreach循环中时,我需要解析title以从以下HTML中获取符号和公司名称;

<b><a href="/q?s=GLEN.L">GLEN.L</a></b>
GLENCORE XSTRAT
<b>343.95</b> <nobr><small>3 May 16:35</small></nobr>
<img width="10" height="14" style="margin-right:-2px;" border="0"
src="http://l.yimg.com/os/mit/media/m/base/images/transparent-1093278.png"
class="pos_arrow" alt="Up"> <b style="color:#008800;">12.80</b>
<bstyle="color:#008800;"> (3.87%)</b> 68,086,160

是否可以解析已解析文档的结果?我不知道从哪里开始。

1 个答案:

答案 0 :(得分:0)

您只需要从您所在的位置继续进行一些XPATH提取工作。有很多种可能性。难点是所有yfnc_tabledata1节点都处于同一级别。以下是如何做到这一点(在控制台应用程序示例中,它将转储符号和公司列表):

HtmlAgilityPack.HtmlDocument page = new HtmlWeb().Load("http://uk.finance.yahoo.com/q/cp?s=%5EFTSE");

// get directly the symbols under the 1st TD element. Recursively search for an A element that has an HREF attribute under this TD.
var symbols = page.DocumentNode.SelectNodes("//td[@class='yfnc_tabledata1']//a[@href]");

foreach (var symbol in symbols)
{
    // from the current A element, go up two level and get the next TD element.
    var company = symbol.SelectSingleNode("../../following-sibling::td").InnerText.Trim();
    Console.WriteLine(symbol.InnerText + ": " + company);
}

有关XPATH轴的更多信息,请访问:XPATH Axes