我无法弄清楚出了什么问题。我只是创建了一个项目来测试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提前。
答案 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());