2012-11-19 66 views
1

如何解析rel =“canonical”标记与html文档中的URL?用HtmlAgilityPack解析rel规范

我想在这里找到的网址:

<link rel="canonical" href="http://stackoverflow.com/questions/2593147/html-agility-pack-make-code-look-neat" /> 

回答

3

假设doc是你HtmlDocument对象。

HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//link[@rel]"); 

应该让你有一个rel属性link元素。现在迭代:

foreach (HtmlNode link in links) 
{ 
    string url; 
    if (link.Attributes["rel"] == "canonical") { 
     url = link.Attributes["href"]; 
    } 
} 

此外,它可以过滤中的SelectNodes链接调用只与“规范”得到的那些:doc.DocumentNode.SelectNodes("//link[@rel='canonical']");

没有测试代码,但你的想法:)

+1

岂不'//链接[@ rel ='canonical']'更容易? –

+0

我正要说,是的:) – CyberDude

0
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(_html); 

String link = (from x in doc.DocumentNode.Descendants() 
      where x.Name == "link" 
      && x.Attributes["rel"] != null 
      && x.Attributes["rel"].Value == "canonical" 
      && x.Attributes["href"] != null 
      select x.Attributes["href"].Value).FirstOrDefault(); 
1

接受的答案不再是正确的,更新的代码如下:

var links = htmlDoc.DocumentNode.SelectNodes("//link[@rel]"); 

string canonical; 

foreach (HtmlNode link in links) 
{ 
    if (link.Attributes["rel"].Value == "canonical") 
    { 
     canonical = link.Attributes["href"].Value; 
    } 
} 
+0

接受的答案有什么问题?它似乎仍然有效?可能是单引号还是双引号的问题? –

+0

@MossPalmer这是几个月前的事,但是IIRC你需要**。现在的价值** – JMK

+0

啊是的。谢谢你清理那个。我甚至没有看。值得注意的是,在你的回答中。谢谢。 –