Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抓取链接到某个网站的锚元素_C#_Xpath_Html Agility Pack - Fatal编程技术网

C# 抓取链接到某个网站的锚元素

C# 抓取链接到某个网站的锚元素,c#,xpath,html-agility-pack,C#,Xpath,Html Agility Pack,我试图在页面上找到链接到某个域的任何链接,然后获取链接href标签 目前我正在这样做: foreach(HtmlAgilityPack.HtmlNode link in entryNode.SelectNodes("//a[@href='*site.com*']")) { MessageBox.Show(imageLink.InnerHtml); } 但我有一个例外: 对象引用未设置为对象的实例 我还尝试了//a[@href=*site.com*],但运气不佳,它说这是一个无效的令牌

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

目前我正在这样做:

foreach(HtmlAgilityPack.HtmlNode link in entryNode.SelectNodes("//a[@href='*site.com*']"))
{
    MessageBox.Show(imageLink.InnerHtml);
}
但我有一个例外:

对象引用未设置为对象的实例

我还尝试了
//a[@href=*site.com*]
,但运气不佳,它说这是一个无效的令牌

我需要什么XPath表达式来查找页面上指向某个域的链接?另外,我将如何提取它们的
href
属性(如果可能,使用相同的XPath表达式)


谢谢。

XPath有一个
包含的
方法,因此非常简单:

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

另外,看起来您是从一个子节点进行匹配的,如果您想使用相同的XPath,您必须在字符串的开头添加一个点
//a[]

干杯,contains似乎是我需要的:)但是,当我使用
//a[contains(@href,'site.com')时
我得到了一个无效的令牌异常。嗯,它对我很有效,我发布的代码对你有用吗?如果没有,你使用的是什么版本的Agility Pack?等等,xpath必须是
//a[contains(@href,'site.com')]
,你的缺少
]
var links = doc.DocumentNode.Descendants("a")
  .Where(a => a.Attributes["href"] != null
      && a.Attributes["href"].Value.ToLower().Contains("stackoverflow.com"));