C#从网站获取数据
我想从中获取数据并将其放入字典中 基本上,这些是一些金融工具的价格和数量 我有这个页面的源代码(这里只是全文的摘录): 但是firstData不包含我想要的信息(值4000),但是:C#从网站获取数据,c#,http,web-scraping,screen-scraping,html-agility-pack,C#,Http,Web Scraping,Screen Scraping,Html Agility Pack,我想从中获取数据并将其放入字典中 基本上,这些是一些金融工具的价格和数量 我有这个页面的源代码(这里只是全文的摘录): 但是firstData不包含我想要的信息(值4000),但是: System.Linq.Enumerable+WhereSelectEnumerableIterator`2[HtmlAgilityPack.HtmlNode,System.String] 如何获取这些数据?我还需要多次重复这个任务,因为页面中有多行包含类似信息。HTML Agility Pack在这种情况下有用
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[HtmlAgilityPack.HtmlNode,System.String]
如何获取这些数据?我还需要多次重复这个任务,因为页面中有多行包含类似信息。HTML Agility Pack在这种情况下有用吗?谢谢 那是因为你的LINQ没有执行。如果在调试器中选中
结果视图
,并运行查询,您将获得所有项目,第一个是您要查找的值
因此,这将使您获得4000.00
var firstData = (from x in document.DocumentNode.Descendants()
where x.Name == "td" && x.Attributes.Contains("class")
select x.InnerText).First();
如果您想全部调用,请调用
ToList()
而不是First()
,因为您的LINQ尚未执行。如果在调试器中选中结果视图
,并运行查询,您将获得所有项目,第一个是您要查找的值
因此,这将使您获得4000.00
var firstData = (from x in document.DocumentNode.Descendants()
where x.Name == "td" && x.Attributes.Contains("class")
select x.InnerText).First();
如果您想要全部,请调用ToList()
,而不是First()
,如果您打开以使用。。那就试试这个
static void Main()
{
CsQuery.CQ cq = CsQuery.CQ.CreateFromUrl("http://www.eurexchange.com/action/exchange-en/4744-19066/19068/quotesSingleViewOption.do?callPut=Put&maturityDate=201411");
string str = cq["#notation115602071 span"].Text();
}
如果你开放使用。。那就试试这个
static void Main()
{
CsQuery.CQ cq = CsQuery.CQ.CreateFromUrl("http://www.eurexchange.com/action/exchange-en/4744-19066/19068/quotesSingleViewOption.do?callPut=Put&maturityDate=201411");
string str = cq["#notation115602071 span"].Text();
}
你可以使用HtmlAgility包。与XmlDocument或XDocument不同,htmlagility包可以容忍格式错误的Html(存在于互联网上,可能存在于您试图解析的站点上) 并非所有HTML页面都可以假定为有效的XML 使用HTMLAgility包,您可以加载页面并使用XPath或类似于System.Xml的对象模型对其进行解析 或者,您可以使用PDF-to-Text转换器,更准确地解析文本文件,因为您链接的网站提供相同数据的PDF导出
您可以使用HTML功能包。与XmlDocument或XDocument不同,htmlagility包可以容忍格式错误的Html(存在于互联网上,可能存在于您试图解析的站点上) 并非所有HTML页面都可以假定为有效的XML 使用HTMLAgility包,您可以加载页面并使用XPath或类似于System.Xml的对象模型对其进行解析 或者,您可以使用PDF-to-Text转换器,更准确地解析文本文件,因为您链接的网站提供相同数据的PDF导出
几年前,我们做了一个类似的项目,对所有主要的在线博彩网站进行搜索,并创建一个比较工具,以获得每种类型活动的最佳价格,例如,按照最佳回报顺序显示所有主要博彩公司对特定足球比赛的博彩赔率 结果证明这是一场噩梦——网站呈现的html输出几乎每天都在变化,而且经常生成格式不好的html,这有时可能会使spider守护进程崩溃,因此我们必须不断维护系统以使其正常工作
有了这些东西,订阅一个需要更少维护和更容易集成的数据源通常是经济的。几年前,我们做了一个类似的项目,对所有主要的在线博彩网站进行爬虫,并创建一个比较工具,以获得每种活动的最佳价格,按照最佳回报的顺序,显示特定足球比赛的所有主要博彩公司的博彩赔率 结果证明这是一场噩梦——网站呈现的html输出几乎每天都在变化,而且经常生成格式不好的html,这有时可能会使spider守护进程崩溃,因此我们必须不断维护系统以使其正常工作
有了这些东西,订阅一个需要更少维护和更容易集成的数据源通常是经济的。这可能有点难看,但它很快就被组合在一起,可能会被大大清理,但它会返回您在该页面上找到的Prices/Quotes表中查找的所有值。希望能有帮助
var url = "http://www.eurexchange.com/action/exchange-en/4744-19066/19068/quotesSingleViewOption.do?callPut=Put&maturityDate=201411";
var webGet = new HtmlWeb();
var document = webGet.Load(url);
var pricesAndQuotesDataTable =
(from elem in
document.DocumentNode.Descendants()
.Where(
d =>
d.Attributes["class"] != null && d.Attributes["class"].Value == "toggleTitle" &&
d.ChildNodes.Any(h => h.InnerText != null && h.InnerText == "Prices/Quotes"))
select
elem.Descendants()
.FirstOrDefault(
d => d.Attributes["class"] != null && d.Attributes["class"].Value == "dataTable")).FirstOrDefault();
if (pricesAndQuotesDataTable != null)
{
var dataRows = from elem in pricesAndQuotesDataTable.Descendants()
where elem.Name == "tr" && elem.ParentNode.Name == "tbody"
select elem;
var dataPoints = new List<object>();
foreach (var row in dataRows)
{
var dataColumns = (from col in row.ChildNodes.Where(n => n.Name == "td")
select col).ToList();
dataPoints.Add(
new
{
StrikePrice = dataColumns[0].InnerText,
DifferenceToPreviousDay = dataColumns[9].InnerText,
LastPrice = dataColumns[10].InnerText
});
}
}
var url=”http://www.eurexchange.com/action/exchange-en/4744-19066/19068/quotesSingleViewOption.do?callPut=Put&maturityDate=201411";
var webGet=new HtmlWeb();
var document=webGet.Load(url);
var Prices和QuotesDataTable=
(来自elem in)
document.DocumentNode.substanders()
.在哪里(
d=>
d、 属性[“类”]!=null&&d.Attributes[“类”]。值==“toggleTitle”&&
d、 任何(h=>h.InnerText!=null&&h.InnerText==“价格/报价”))
选择
elem.后代()
.第一道防线(
d=>d.Attributes[“class”!=null&&d.Attributes[“class”]。Value==“dataTable”)。FirstOrDefault();
if(pricesAndQuotesDataTable!=null)
{
var dataRows=来自pricesAndQuotesDataTable.subjections()中的元素
其中elem.Name==“tr”&&elem.ParentNode.Name==“tbody”
选择元素;
var dataPoints=新列表();
foreach(数据行中的变量行)
{
var dataColumns=(来自row.ChildNodes.Where(n=>n.Name==“td”)中的列)
选择col.ToList();
数据点。添加(
新的
{
StrikePrice=dataColumns[0]。InnerText,
DifferenceToPreviousDay=dataColumns[9]。InnerText,
LastPrice=dataColumns[10]。InnerText
});
}
}
这可能有点难看,但它很快就被组合在一起,可能会被大大清理,但它会返回您正在查看的所有值