与HtmlAgilityPack的麻烦

时间:2012-01-28 17:35:45

标签: c# xpath html-agility-pack

我无法弄清楚出了什么问题。我只是创建了一个项目来测试HtmlAgilityPack以及我得到了什么。

using System;
using System.Collections.Generic;
using System.Text;
using HtmlAgilityPack;


namespace parseHabra
{
    class Program
    {
        static void Main(string[] args)
        {
            HTTP net = new HTTP(); //some http wraper
            string result = net.MakeRequest("http://stackoverflow.com/", null);
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(result);

            //Get all summary blocks
            HtmlNodeCollection news = doc.DocumentNode.SelectNodes("//div[@class=\"summary\"]");
            foreach (HtmlNode item in news)
            {
                string title = String.Empty;
                //trouble is here for each element item i get the same value
                //all the time
                title = item.SelectSingleNode("//a[@class=\"question-hyperlink\"]").InnerText.Trim();
                Console.WriteLine(title);
            }
            Console.ReadLine();
        }
    }
}

看起来我没有为我选择的每个节点创建xpath,而是整个文档。有什么建议为什么呢? Thx提前。

2 个答案:

答案 0 :(得分:2)

我还没有尝试过你的代码,但是从快速看看我怀疑问题是//正在从整个文档的根目录进行搜索而不是当前元素的根目录,因为我猜你正在期待

尝试在.

之前加//
".//a[@class=\"question-hyperlink\"]"

答案 1 :(得分:1)

我会将您的xpath重写为单个查询以查找所有问题标题,而不是查找摘要然后标题。克里斯的回答指出了可以轻易避免的问题。

var web = new HtmlWeb();
var doc = web.Load("http://stackoverflow.com");

var xpath = "//div[starts-with(@id,'question-summary-')]//a[@class='question-hyperlink']";

var questionTitles = doc.DocumentNode
    .SelectNodes(xpath)
    .Select(a => a.InnerText.Trim());