用C#怎么提取a标签的超链接?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C#怎么提取a标签的超链接?相关的知识,希望对你有一定的参考价值。

请问<a href="#none" clstag="shangpin|keycount|product|yanse-米色">这种a标签里的href用C#怎么能提取出url?我遍历了所有的超链接,也没有找到我需要的。

第一种方法,正则表达式。如下所示
string reg = @"<a[^>]*href=([""\'])?(?<href>[^\'""]+)\\1[^>]*>";
var item = Regex.Match(str, reg, RegexOptions.IgnoreCase);
Console.WriteLine(item.Groups["href"].Value);
第二种使用htmlagilitypack的xpath进行提取
HtmlNodeCollection atts = _doc.DocumentNode.SelectNodes("//a[@href]");
一般在使用爬虫时都会用自有的框架进行数据提取和分离。其中正则比较简洁和高效。但需要提前调试好。第三方控件使用起来比较容易而且还有其他功能可以辅助使用。
参考技术A

你需要一些用于提取括号的函数:

❶ ListIndex(str, '<', '>') 返回所有尖括号的位置索引。『SortedList<int,int> 』

❷ Cut(str, '\\"', '\\"') 返回第一个双引号内的内容。『string』

❸ CutAll(str, '<', '>') 返回所有尖括号内的内容。『List<string>』


        /// <summary>

        /// 获取指定开始字符和结束字符的所有位置。

        /// <para>返回一个int,int有序列表,Key表示开始字符的位置,Value表示结束位置。</para>

        /// <para>"(ad)b(c)b(ea)".ListIndex('(',')') = [0, 3],[5, 7],[9, 12]</para>

        /// <para>将忽略处于其他开始和结束字符内部的开始字符。</para>

        /// </summary>

        public static SortedList<int,int> ListIndex(this string str, char 开始字符, char 结束字符)

            int len = str.Length;

            SortedList<int, int> list = new SortedList<int, int>();

            if (len < 2) return list;

            int 开始位置 = 0;

            int 结束位置 = 0;

            //搜索开始字符

            while ((开始位置 = str.IndexOf(开始字符, 开始位置)) != -1)

                //搜索结束字符

                while ((结束位置 = str.IndexOf(结束字符, 开始位置 + 1)) != -1)

                    list.Add(开始位置, 结束位置);

                    开始位置 = 结束位置 + 1;

                    break;

               

           

            return list;

       


       /// <summary>

        /// 截取并返回指定「开始字符」和 「结束字符」之间的字符串。〈<see cref="string"/>〉

        /// <para>可以指定是否包括「开始字符」和「结束字符」。默认为不包括。</para>

        /// <para>❶ "abcde".Cut('b', 'd', false, false) 返回值 ➤ "c" </para>

        /// <para>❷ "abcde".Cut('b', 'd', true, false) 返回值 ➤ "bc" </para>

        /// <para>❸ "abcde".Cut('b', 'd', false, true) 返回值 ➤ "cd" </para>

        /// <para>❹ "abcde".Cut('b', 'd', true, true) 返回值 ➤ "bcd" </para>

        /// <para>如果「开始位置」大于「结束位置」或「开始位置」小于 0 或「结束位置」小于 0 ,则返回空字符串「<see cref="string.Empty"/>」。</para>

        /// <para>如果没有「结束字符」,则返回空字符串。</para>

        /// </summary>

        /// <param name="str">该字符串本身</param>

        /// <param name="开始字符">开始的Index,从0开始</param>

        /// <param name="结束字符">结束字符char</param>

        /// <param name="包括开始字符">默认false。表示返回字符串中不包括开始字符</param>

        /// <param name="包括结束字符">默认false。表示返回字符串中不包括开始字符</param>

        /// <returns>截取并返回指定 开始位置 和 结束字符 之间的字符串。</returns>

        public static string Cut(this string str, char 开始字符, char 结束字符, bool 包括开始字符 = false, bool 包括结束字符 = false)

            int len = str.Length;

            int a = 包括开始字符 ? 1 : 0;

            int b = 包括结束字符 ? 1 : 0;           

            int 开始 = str.IndexOf(开始字符, 0);

            int t = 开始 + 1;  

            int 结束 = str.IndexOf(结束字符, t);

            if (开始 < 0 || 开始 > 结束 || 结束 < 0) return "";

            if (结束 > len) return str.Substring(t);

            int 长度 = 结束 - t;

            return str.Substring(t - a, 长度 + a + b);

       


        /// <summary>

        /// 指定开始字符和结束字符并返回List截取的字符串。不包括开始字符和结束字符。

        /// <para>"adbcbea".Cut('a','b') = "d"</para>

        /// <para>如果开始位置大于结束位置或小于0,则返回空List(Of String)。</para>

        /// <para>如果没有结束字符,则不会识别,返回空List(Of String)。</para>

        /// </summary>

        public static List<string> CutAll(this string str, char 开始字符, char 结束字符)

            int len = str.Length;

            List<string> list = new List<string>();

            if (len < 2) return list;

            bool 已展开 = false;

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < len; i++)

                char c = str[i];

                if (已展开 == false)

                    if (c == 开始字符) 已展开 = true; sb.Clear();

                else

                    if (c == 结束字符) 已展开 = false; list.Add(sb.ToString()); else sb.Append(c);

               

           

            return list;

       

参考技术B 那就用正则提取

使用 c# 在 OpenOffice calc 中的超链接

【中文标题】使用 c# 在 OpenOffice calc 中的超链接【英文标题】:Hyperlink within a OpenOffice calc using c# 【发布时间】:2012-07-17 13:00:31 【问题描述】:

我在 openoffice 中使用 c# 制作了一个电子表格,其中包含几个不同的工作表。在工作表 1 上是工作表其余部分的所有名称的列表。如何设置从每个单元格到相应工作表的超链接。

我浏览了互联网,但我一直在努力寻找任何有用的信息。谁能指出我如何编程的正确方向?

【问题讨论】:

【参考方案1】:

我不确定我是否理解正确,但这可能会有所帮助,请将其放在您的牢房中:

=HYPERLINK("MyTableName.C3")

这(应该)跳转到表 MyTableName 中的单元格 C3。 要跳转到表格,请使用

=HYPERLINK("#MyTableName")

我无法尝试,因为我不使用 OpenOffice

来源:http://www.ooowiki.de/HyperLink

【讨论】:

对不起,我已经非常清楚地解释了我的问题。我用 c# 制作了这个电子表格,我问如何使用 c# 创建超链接 将 =HYPERLINK() 公式放入单元格中 我从 plm 文件中取出数据并将它们放入一个空白的电子表格文件中,因此我没有直接在电子表格文件中输入任何内容,这一切都是在 Visual Studio 中使用 c# 完成的 然后使用类似myCell = string.Format("=HYPERLINK(\"#0\")", TableName); 我收到错误消息“无法将类型'string'隐式转换为'unoidl.com.sun.star.table.XCell”

以上是关于用C#怎么提取a标签的超链接?的主要内容,如果未能解决你的问题,请参考以下文章

php高手请进:正则提取超链接中的网址和标题,如果兼顾有双引号和单引号或没有引号的超链接?

用excel怎么制作文件夹结构索引,并在每个文件夹名上加上指向文件夹的超链接?

用html.parser抓网页中的超链接,返回list

在一个excel文件里头有1600个PDF的超链接,如何批量下载?

怎么直接在html修改li里面的超链接的字体颜色

如何提取PDFBox的超链接信息