【发布时间】:2020-11-23 18:26:42
【问题描述】:
我有一些 HTML 的 sn-p,其中包含一些带有以标签开头的 href 的链接,如下所示
<a href="#Getting Started">Getting Started</a>
我是 AngleSharp 新手,正在尝试使用它来查找这些链接并将 href 替换为新值,然后返回更新后的 HTML 标记。
【问题讨论】:
标签: c# html anglesharp
我有一些 HTML 的 sn-p,其中包含一些带有以标签开头的 href 的链接,如下所示
<a href="#Getting Started">Getting Started</a>
我是 AngleSharp 新手,正在尝试使用它来查找这些链接并将 href 替换为新值,然后返回更新后的 HTML 标记。
【问题讨论】:
标签: c# html anglesharp
AngleSharp 的美妙之处在于,您基本上可以回退到任何 JS 解决方案 - 因为 AngleSharp 公开了 W3C DOM API(JS 也使用它)。您需要做的就是用 PascalCase 替换某些 camelCase,并使用标准的 .NET 工具而不是 JS 中的东西。
让我们以How to Change All Links with javascript 为例(抱歉,这是我在 Google 搜索中的第一次点击)并以此为起点。
var context = BrowsingContext.New(Configuration.Default);
var document = await context.OpenAsync(res => res.Content(""));
var anchors = document.GetElementsByTagName("a");
for (var i = 0; i < anchors.Length; i++)
{
var anchor = anchors[i] as IHtmlAnchorElement;
anchor.Href = "http://example.com/?redirect=" + anchor.Href;
}
所以在我们的例子中,我们对相同的转换不感兴趣,而是对非常相似的转换感兴趣。我们可以这样做:
for (var i = 0; i < anchors.Length; i++)
{
var anchor = anchors[i] as IHtmlAnchorElement;
if (anchor.GetAttribute("href")?.StartsWith("#") ?? false)
{
anchor.Href = "your-new-value";
}
}
原因是Href 总是被规范化(即完整的 URL),因此“#foo”的属性值可能看起来像“http://example.com/path#foo”。通过查看 raw 值,我们可以假设该值仍然以井号开头。
【讨论】:
document.Body.InnerHtml 的人来说是完整的,这给了我更新的 HTML 文本。
document.ToHtml(),因为它还会序列化文档类型和标题。