html的table中的tr都有data-coin属性,取得所有tr后,想用每个tr取得下级的td中带class='click left_l'的td,问题就在这一步,tr是对的,但是使用hn.SelectSingleNode("//td[@class='click left_l']");取得的 HtmlNode tdNode 永远是第一个tr里的那个td内容,是什么问题呢string testHtml = "<table id='tableAsset'><tr data-coin=''><td class='click left_l'>1</td></tr><tr data-coin=''><td class='click left_l'>2</td></tr><tr data-coin=''><td class='click left_l'>3</td></tr></table>";
            StringBuilder infoStr = new StringBuilder();
            //string html = webBrowser1.Document.GetElementById("tableAsset").OuterHtml;
            string html = testHtml;
            doc.LoadHtml(html);
            HtmlNodeCollection trNodes = doc.DocumentNode.SelectNodes("//tr[@data-coin]");
            if (trNodes != null && trNodes.Count > 0)
            { 
                foreach (HtmlNode hn in trNodes)
                {  
                    HtmlNode tdNode = hn.SelectSingleNode("//td[@class='click left_l']");
                    
                    if (tdNode != null)
                    {
                        infoStr.AppendFormat("{0}  ",tdNode.InnerText);
                    } 
                    infoStr.AppendLine();
                }
                label1.Text = infoStr.ToString();
            }

解决方案 »

  1.   

    public HtmlNode SelectSingleNode(string xpath)你的参数不对,参数是相关节点的xpath,你可以调试的时候通过根节点找到相关的子节点,然后查看节点的xpath属性,把对应的信息填入就可以了。
      

  2.   

    doc.DocumentNode.SelectSingleNode(   
    "/html[1]/body[1]/center[1]/table[2]/tr[1]/td[1]/table[1]")类似这样的参数
      

  3.   

    我那种写法也是xpath。。你这种写法我也试过的,一样,不关这个的事
      

  4.   

            public static void ReadHtmlData()
            {
                WebRequest request = WebRequest.Create(@"http://bbs.csdn.net/topics/392317973");            WebResponse response = request.GetResponse();            Stream dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream, Encoding.UTF8);            string htmlContent = reader.ReadToEnd();
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(htmlContent);            HtmlNode node = doc.DocumentNode.SelectSingleNode(@"/html[1]/body[1]/div[2]");
            }你试试?
      

  5.   

    我认为 css 选择器语法比 XPath 好得多,你可以试试支持 css 选择器语法的解析器:http://blog.csdn.net/closurer/article/details/73466685
      

  6.   

    因为你写的xpath不正确,把开头的//去掉。hn.SelectSingleNode("td[@class='click left_l']");