c# HtmlAgilityPack 和 Yahoo 的 HTML
c# HtmlAgilityPack and Yahoo's HTML
所以我偷懒写了一些东西,首先查询其他网站并加载所有相关的证券交易所代码,然后尝试遍历这些代码并加载雅虎的服务器以获取最新的股票价格。出于某种原因,无论我尝试使用 HtmlAgilityPack 搜索什么,我似乎都无法获得任何相关信息。我不认为页面加载后某些 javascript 运行 有问题(但我可能是错的)。
以下是一个通用例程,可以对其进行修改以尝试从 Yahoo 获取股票代码的百分比变化:
string symbol = "stock symbol"
string link = @"http://finance.yahoo.com/q?uhb=uh3_finance_vert&s=" + symbol;
string data = String.Empty;
try
{
// keep in this scope so wedget and doc deconstruct themselves
var webget = new HtmlWeb();
var doc = webget.Load(link);
string percGrn = doc.FindInnerHtml("//span[@id='yfs_pp0_" + symbol + "']//b[@class='yfi-price-change-up']");
string percRed = doc.FindInnerHtml("//span[@id='yfs_pp0_" + symbol + "']//b[@class='yfi-price-change-down']");
// create somthing we'll nuderstand later
if ((String.IsNullOrEmpty(percGrn) && String.IsNullOrEmpty(percRed)) ||
(!String.IsNullOrEmpty(percGrn) && !String.IsNullOrEmpty(percRed)))
throw new Exception();
// adding string to empty gives string
string perc = percGrn + percRed;
bool isNegative = String.IsNullOrEmpty(percGrn);
double percDouble;
if (double.TryParse(Regex.Match(perc, @"\d+([.])?(\d+)?").Value, out percDouble))
data = (isNegative ? 0 - percDouble : percDouble).ToString();
}
catch (Exception ex) { }
finally
{
// now we need to check what we have and load into the datgridView
if (!newData_d.ContainsKey(symbol)) newData_d.Add(symbol, data);
else MessageBox.Show("ERROR: Duplicate stock Symbols for: " + symbol);
}
这里是 FindInnerHtml 的扩展方法:
// this is for the html agility class
public static string FindInnerHtml( this HtmlAgilityPack.HtmlDocument _doc, string _options)
{
var node = _doc.DocumentNode.SelectSingleNode(_options);
return (node != null ? node.InnerText.ToString() : String.Empty);
}
如能帮助我们取回东西,我们将不胜感激,谢谢!
////////////////////////////////////
编辑:
///////////////////////////////////////////
我突出显示了跨度 ID,然后查看第 239 行我看到的地方 'yfi-price-change-up' 参考:
以下 XPath 成功找到包含增加(或减少)百分比的目标 <span>
:
var doc = new HtmlWeb().Load("http://finance.yahoo.com/q?uhb=uh3_finance_vert&s=msft");
var xpath = "//span[contains(@class,'time_rtq_content')]/span[2]";
var span = doc.DocumentNode.SelectSingleNode(xpath);
Console.WriteLine(span.InnerText);
输出:
(0.60%)
所以我偷懒写了一些东西,首先查询其他网站并加载所有相关的证券交易所代码,然后尝试遍历这些代码并加载雅虎的服务器以获取最新的股票价格。出于某种原因,无论我尝试使用 HtmlAgilityPack 搜索什么,我似乎都无法获得任何相关信息。我不认为页面加载后某些 javascript 运行 有问题(但我可能是错的)。
以下是一个通用例程,可以对其进行修改以尝试从 Yahoo 获取股票代码的百分比变化:
string symbol = "stock symbol"
string link = @"http://finance.yahoo.com/q?uhb=uh3_finance_vert&s=" + symbol;
string data = String.Empty;
try
{
// keep in this scope so wedget and doc deconstruct themselves
var webget = new HtmlWeb();
var doc = webget.Load(link);
string percGrn = doc.FindInnerHtml("//span[@id='yfs_pp0_" + symbol + "']//b[@class='yfi-price-change-up']");
string percRed = doc.FindInnerHtml("//span[@id='yfs_pp0_" + symbol + "']//b[@class='yfi-price-change-down']");
// create somthing we'll nuderstand later
if ((String.IsNullOrEmpty(percGrn) && String.IsNullOrEmpty(percRed)) ||
(!String.IsNullOrEmpty(percGrn) && !String.IsNullOrEmpty(percRed)))
throw new Exception();
// adding string to empty gives string
string perc = percGrn + percRed;
bool isNegative = String.IsNullOrEmpty(percGrn);
double percDouble;
if (double.TryParse(Regex.Match(perc, @"\d+([.])?(\d+)?").Value, out percDouble))
data = (isNegative ? 0 - percDouble : percDouble).ToString();
}
catch (Exception ex) { }
finally
{
// now we need to check what we have and load into the datgridView
if (!newData_d.ContainsKey(symbol)) newData_d.Add(symbol, data);
else MessageBox.Show("ERROR: Duplicate stock Symbols for: " + symbol);
}
这里是 FindInnerHtml 的扩展方法:
// this is for the html agility class
public static string FindInnerHtml( this HtmlAgilityPack.HtmlDocument _doc, string _options)
{
var node = _doc.DocumentNode.SelectSingleNode(_options);
return (node != null ? node.InnerText.ToString() : String.Empty);
}
如能帮助我们取回东西,我们将不胜感激,谢谢!
//////////////////////////////////// 编辑: ///////////////////////////////////////////
我突出显示了跨度 ID,然后查看第 239 行我看到的地方 'yfi-price-change-up' 参考:
以下 XPath 成功找到包含增加(或减少)百分比的目标 <span>
:
var doc = new HtmlWeb().Load("http://finance.yahoo.com/q?uhb=uh3_finance_vert&s=msft");
var xpath = "//span[contains(@class,'time_rtq_content')]/span[2]";
var span = doc.DocumentNode.SelectSingleNode(xpath);
Console.WriteLine(span.InnerText);
输出:
(0.60%)