在字符串中查找 hrefs 值

Posted

技术标签:

【中文标题】在字符串中查找 hrefs 值【英文标题】:Find hrefs value in string 【发布时间】:2020-02-22 20:10:32 【问题描述】:

如何从所有 href 中检索所有 url 我不想使用 html Agility Pack 或类似的 - 必须是干净的代码并且非常短。

        HttpClient client = new HttpClient();
        static async Task Main(string[] args)
        
            Program program = new Program();
            await program.GetTodoItems();
            await program.Function();
            Console.WriteLine("Hello Word!");
        

        private async Task GetTodoItems()
        
            string ResponseHtml = await client.GetStringAsync("https://example.com");

            var LinkParser = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            foreach (Match m in LinkParser.Matches(ResponseHtml))
            
                Console.WriteLine(m.Value);
            
        

我希望干净的网址不会翻倍,并且仅适用于网站而不适用于脚本。这段代码向我展示了一些带有额外标签和字符的链接:

https://example.com/libs/jquery/1.11.2/jquery.min.js">

https://www.google-analytics.com/analytics.js','ga

【问题讨论】:

您说您要检索所有网址,但您的正则表达式仅匹配以 http: https: 和 www 开头的字符串。这并不涵盖您在 href 中可能遇到的所有 url 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。 锁定没有明确的持续时间,因为以前的锁定已过期。请不要和版主玩猫捉老鼠。 【参考方案1】:

围绕“一个或多个非空白”扩展捕获组

LinkParser = new Regex(@"\b(?<url>https?://\S+)['""]", RegexOptions.Compiled | RegexOptions.IgnoreCase);

然后使用

访问匹配集合
m.Groups["url"].Value

更简单的模式也可以很好地工作:\b(?&lt;url&gt;http.*?)['"]

这些都是非常原始的,我不能保证它适用于所有情况。如果您的 url 根本没有被引用,请考虑在 end 类中添加空格和右尖括号。你最好使用可靠的库来处理这个because ...

【讨论】:

这并不能解决 OP 的问题,它仍然会捕获 url 之后直到第一个空格的任何内容。

以上是关于在字符串中查找 hrefs 值的主要内容,如果未能解决你的问题,请参考以下文章

从Dict(python)中的itemgetter查找值

小程序 - 去字符串空格/二叉树查找

Python列表操作

python 字符串 字符串的相关方法

查找字符串并将其值保存在字符串中

Python冷饭干货—字符串操作方法