0

我正在尝试解析 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 循环中时,我需要解析标题以从以下 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

是否可以解析已解析文档的结果?我有点不确定从哪里开始。

4

1 回答 1

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

于 2013-05-04T15:53:31.983 回答