我已经使用C#/ html敏捷包中的节点工作了一段时间,并且通过反复试验,我有一个我要循环的节点列表,获取每个节点的子节点来自循环的节点。我想通过索引#来引用它们(似乎是最简单的,但在这里我发布)。我尝试了不同的格式化xpath的方法,包括" [0]"," / [0]"," tr / [0]&# 34;等等。到目前为止,我所拥有的一切,一切正常,直至第一个注释行:
protected override List<IDataPoint> ReturnDataPointsFromIndividualAddressString(string AddressString)
{
List<IDataPoint> earningsAnnouncements = new List<IDataPoint>();
HtmlWeb hwObject = new HtmlWeb();
HtmlDocument htmlDoc = hwObject.Load(AddressString);
if (htmlDoc.DocumentNode != null)
{
List<HtmlNode> nodeList = new List<HtmlNode>();
var nodes = htmlDoc.DocumentNode.SelectNodes("html[1]/body[1]/table[4]/tr[1]/td[1]/table[1]/tr");
if (nodes != null)
{
foreach (HtmlNode n in nodes)
{
if (n.OuterHtml.Contains("finance.yahoo.com"))
nodeList.Add(n);
}
}
foreach (HtmlNode node in nodeList)
{
EarningsAnnouncementDP earningsAnnouncement = new EarningsAnnouncementDP();
//Error: Expression must evaluate to a node set.
earningsAnnouncement.Company = (node.SelectSingleNode("[0]")).InnerText.ToString();
earningsAnnouncement.Ticker = node.SelectSingleNode("[1]").InnerText.ToString();
earningsAnnouncement.Estimate = node.SelectSingleNode("[2]").InnerText.ToString();
earningsAnnouncement.AnnouncementTime = node.SelectSingleNode("[3]").InnerText.ToString();
earningsAnnouncements.Add(earningsAnnouncement);
}
return earningsAnnouncements;
}
答案 0 :(得分:4)
您已经遍历tr
个节点。现在您应该访问td
节点。所以你可以使用下面的XPATH
。
node.SelectSingleNode("./td[1]").InnerText;
node.SelectSingleNode("td[1]").InnerText;
第一个td
节点也是td[1]
而不是td[0]
。
正如亚历克斯所指出的,你可以写下面的内容,这是一个很好的建议。
node.ChildNodes[0].InnerText
HTH