c#-4.0 - HTML敏捷包/xpath通过[index]帮助选择子节点,好吗?

标签 c#-4.0 xpath html-agility-pack

我已经使用C#/ html敏捷包中设置的节点进行了一段时间的工作,通过反复试验,我有了要循环的节点列表,从循环中获取每个节点的子节点。我想通过索引#引用它们(似乎是最简单的方法,但是我在这里发布了)。我尝试了各种格式化xpath的方法,包括“ [0]”,“ / [0]”,“ tr / [0]”等。到目前为止,这是我所做的一切,直到第一个被注释的内容都可以正常工作线:

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;
                }

最佳答案

您已经遍历了tr节点。现在,您应该访问td节点。因此,您可以像下面一样使用XPATH

node.SelectSingleNode("./td[1]").InnerText;
node.SelectSingleNode("td[1]").InnerText;


同样,第一个td节点以td[1]而不是td[0]的身份访问。

正如Alex所指出的,您可以像下面这样写,这是一个很好的建议。

node.ChildNodes[0].InnerText


高温超导

关于c#-4.0 - HTML敏捷包/xpath通过[index]帮助选择子节点,好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10036052/

相关文章:

python - 我正在尝试为添加按钮制定 Xpath 或 CSS

c# - HTML Agility Pack - 从 SPAN 标签内的第一个 STRONG 标签获取文本

c# - HTML Agility Pack 选择节点

c# - C#4 会允许 "dynamic casting"吗?如果不支持,C# 应该支持吗?

wcf - 如何在 WCF 中使用 WS-Addressing 并设置 wsa :replyto header?

c#-4.0 - 如何使用 C# 创建新的 Azure CDN?

C# HTMLAgilityPack HTML to Text - 解析错误

c# - 我可以使用 XmlSerializer 控制某些字段的序列化吗

javascript - Chrome 扩展内容页面的 wicked-good-xpath

java - 尝试通过获取childnode值来获取nodeList