0

我试图在页面上找到链接到某个域的任何链接,然后获取链接href标签。

目前我正在这样做:

foreach(HtmlAgilityPack.HtmlNode link in entryNode.SelectNodes("//a[@href='*site.com*']"))
{
    MessageBox.Show(imageLink.InnerHtml);
}

但我得到了这个例外:

你调用的对象是空的。

我也试过//a[@href=*site.com*]没有运气,它说这是一个无效的令牌。

我需要在页面上找到链接到某个域的任何链接的 XPath 表达式是什么?另外,我将如何提取它们的href属性(如果可能,在相同的 XPath 表达式中)。

谢谢。

4

1 回答 1

0

XPath 有一个contains方法,所以很简单:

var urls = new List<Uri>();
var url = new Uri("http://stackoverflow.com/questions/12131954/");
using (var client = new WebClient())
{
  var doc = new HtmlDocument();
  doc.Load(client.OpenRead(url));
  var links = doc.DocumentNode.SelectNodes("//a[contains(@href,'stackoverflow.com')]");
  foreach (var link in links)
  {
    var uri = new Uri(url, link.Attributes["href"].Value); //fixes relative Urls
    if (uri.Scheme.StartsWith("http"))
    {
      urls.Add(uri);
    }
  }
  Console.WriteLine(urls);
}

或者您可以使用 Linq 获取链接

var links = doc.DocumentNode.Descendants("a")
  .Where(a => a.Attributes["href"] != null
      && a.Attributes["href"].Value.ToLower().Contains("stackoverflow.com"));

此外,您似乎是从子节点匹配的,如果您想使用相同的 XPath,则必须在字符串的开头添加一个点.//a[]

于 2012-08-26T17:09:36.860 回答