【问题标题】:How to find and replace href values on links using AngleSharp?如何使用 AngleSharp 查找和替换链接上的 href 值?
【发布时间】:2020-11-23 18:26:42
【问题描述】:

我有一些 HTML 的 sn-p,其中包含一些带有以标签开头的 href 的链接,如下所示

<a href="#Getting Started">Getting Started</a>

我是 AngleSharp 新手,正在尝试使用它来查找这些链接并将 href 替换为新值,然后返回更新后的 HTML 标记。

【问题讨论】:

    标签: c# html anglesharp


    【解决方案1】:

    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(),因为它还会序列化文档类型和标题。
    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 2015-09-16
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2019-08-28
    • 2014-05-19
    • 2018-03-22
    相关资源
    最近更新 更多