【发布时间】:2015-10-19 15:47:05
【问题描述】:
我正在使用 HTML Agility Pack 来定义一个返回网页链接的函数。问题是它返回所有链接,包括 mailto。
在程序的后期,处理链接时,mailto 链接会中断。我正在尝试消除它们包含在 _links 的函数输出列表中
我的函数定义为:
var linkNodes = _htmlDocument.Value.DocumentNode.SelectNodes("//a");
if (linkNodes == null)
return Enumerable.Empty<Link>();
var links = new List<Link>();
foreach (var linkNode in linkNodes)
{
var href = linkNode.GetAttributeValue("href", "#");
if (!Uri.IsWellFormedUriString(href, UriKind.RelativeOrAbsolute))
continue;
var url = href.ToAbsoluteUri(Url);
var follow = linkNode.GetAttributeValue("rel", "follow");
links.Add(new Link(Url, url, linkNode.InnerText, follow));
}
_links = links;
我的 LINQ 几乎可以工作(在摆脱 mailto 的过程中工作,但返回字符串而不是与所使用的战斗机匹配的节点):
var linkNodes = _htmlDocument.Value.DocumentNode.SelectNodes("//a[@href]")
.Select(a => a.Attributes["href"].Value)
.Where(href => !href.StartsWith("mailto:")) // skip emails, find only url links
.ToList();
【问题讨论】:
-
尝试将您的 linq 更改为
htmlDocument.Value.DocumentNode.SelectNodes("//a[@href]").Where(a => !a.Attributes["href"].Value.StartsWith("mailto:")).ToList(); -
在其中一次迭代中出现错误:{"Value cannot be null.\r\nParameter name: source"}
-
如果您有 c#6,请尝试使用空条件运算符。
htmlDocument.Value.DocumentNode.SelectNodes("//a[@href]").Where(a => !a.Attributes["href"].Value?.StartsWith("mailto:") ?? false).ToList(); -
我想我看到了,但是解释我哪里出错了会有所帮助,我可以标记一个已接受的答案
标签: c# linq html-agility-pack linq-to-objects