【问题标题】:HTML Agility Pack Question (Attempting to parse string from source)HTML Agility Pack 问题(尝试从源代码解析字符串)
【发布时间】:2011-08-02 15:34:31
【问题描述】:

我正在尝试使用 Agility 包来解析来自不同页面的某些信息。我有点担心使用它可能会过度使用我需要的东西,如果是这种情况,请随时告诉我。无论如何,我正在尝试解析来自杂色傻瓜的页面,以根据股票代码获取公司的名称。我将解析几个页面以类似的方式获取股票信息。

我要解析的 HTML 如下所示:

<h1 class="subHead"> 
    Microsoft Corp <span>(NASDAQ:MSFT)</span>
</h1>

另外,我要解析的页面是:http://caps.fool.com/Ticker/MSFT.aspx

所以,我想我的问题是我如何简单地从 html 中获取 Microsoft Corp,我什至应该使用敏捷包来做这样的事情吗?

编辑:当前代码

public String getStockName(String ticker)
{
    String text ="";
    HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = web.Load("http://caps.fool.com/Ticker/" + ticker + ".aspx");

    var node = doc.DocumentNode.SelectSingleNode("/h1[@class='subHead']");
    text = node.FirstChild.InnerText.Trim();
    return text;
}

【问题讨论】:

  • 我发现 HTML Agility Pack 非常适合这种情况 - 即在没有提供数据源的情况下,但出于某种原因您仍想解析第 3 方数据。我做了一些与你过去所做的非常相似的事情。下一步是解析价格、每日变化等:)
  • @C.McAtackney 谢谢!是的,这只是一个开始,但我认为一旦我的脚湿了,它就不会那么粗糙了。感谢您让我知道我在正确的轨道上。

标签: c# html html-parsing html-agility-pack


【解决方案1】:

这将为您提供所有股票名称的列表,对于您的 Microsoft 示例 Html:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load("test.html");

var nodes = doc.DocumentNode.SelectNodes("//h1[@class='subHead']");
foreach (var node in nodes)
{
    string text = node.FirstChild.InnerText; //output: "Microsoft Corp"
    string textAll = node.InnerText; //output: "Microsoft Corp (NASDAQ:MSFT)"
}

编辑基于更新的问题 - 这应该适合你:

string text = "";
HtmlWeb web = new HtmlWeb();

string url = string.Format("http://caps.fool.com/Ticker/{0}.aspx", ticker);
HtmlAgilityPack.HtmlDocument doc = web.Load(url);

var node = doc.DocumentNode.SelectSingleNode("//h1[@class='subHead']");
text = node.FirstChild.InnerText.Trim();
return text;

【讨论】:

  • @broken 谢谢!我很感激帮助。如果您不介意,我还有一个我在编辑底部描述的小问题,如果您在该问题上提供任何帮助,我将不胜感激。祝你有美好的一天!
  • @BrokenGlass 再次感谢您!我正在使用您更新的代码,但仍然出现错误。 “你调用的对象是空的。”它发生在节点...Trim()。有没有可能是 Select 节点没有找到任何东西?
  • @PFranchise:此代码适用于我,已使用 ticker = "MSFT" 进行了测试 - 刚刚使用 AAPL 再次尝试,并且效果也很好 - 你确定你使用的是 exactly 这个吗代码?
  • @PFranchise:您在更新的代码中缺少反斜杠:它应该是 var node = doc.DocumentNode.SelectSingleNode("//h1[@class='subHead']"); - 这很可能是您的问题
  • @BrokenGlass 啊哈!所有作品!非常感谢您的出色帮助。非常感谢。
【解决方案2】:

使用 xpath 表达式选择元素然后拾取文本。

 foreach (var element in doc.DocumentNode.SelectNodes("//h1[@clsss='subHead']/span"))
 {
    Console.WriteLine (element.InnerText);
 } 

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 2011-06-12
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多