如何从`pre`标签中提取原始代码?

时间:2015-08-08 14:39:07

标签: html .net communication c#-5.0 instant-messaging

我看到pre元素中的每个代码令牌都被带有样式的span包围。我怎么能,例如提取线:

using MySql.Data.MySqlClient;

来自HTML:

<pre lang="cs" id="pre82739" style="margin-top: 0px;"><span class="code-keyword">using</span> MySql.Data.MySqlClient;</pre>

提取的代码不需要包含语法高亮或其他构成,它必须编译才能执行它要执行的任务。

这样做的目的是建立一种方法,自动将代码从网页,最终其他设备和格式转移到可以快速使用的目的地,例如将其发送到用户可以复制和过去的Skype它进入了他们的代码。

2 个答案:

答案 0 :(得分:1)

好吧,如果你想剥离 HTML并且你已经尝试(没有成功)正则表达式,那么我必须为我自己的项目投入一个你应该可以使用的。 / p>

/(<\/?(pre|span)[\s\S]*?>)|((style|class|id|lang|) ?\= ?['"][\s\S]*?['"])/gi

这是来自Javascript文件,因此C#中的包装可能不同,但实际表达式应该匹配。根据需要调整。

Live demo of course.

答案 1 :(得分:1)

HTML Agility Pack让这很简单。此库允许您像使用XPath或LINQ的XML文档一样查询和导航HTML。

using System;
using HtmlAgilityPack;

namespace ConsoleApplication1
{
    class Program
    {
        private static void Main(string[] args)
        {
            string html = "<pre lang=\"cs\" id=\"pre82739\" style=\"margin-top: 0px;\"><span class=\"code-keyword\">using</span> MySql.Data.MySqlClient;</pre>";

            var document = new HtmlDocument();
            document.LoadHtml(html);

            //"//pre" is the XPATH to find all tags in the document that are named `<pre>`
            foreach (var node in document.DocumentNode.SelectNodes("//pre"))
            {
                //prints "using MySql.Data.MySqlClient;"
                Console.WriteLine(node.InnerText);
                Console.WriteLine("--------------------------");
            }

            Console.ReadLine();
        }
    }
}

如果您传入完整的HTML文档,则每Console.WriteLine(node.InnerText);个块会调用<pre>一次。例如,这里是解析你自己的问题(在撰写本文时你应该得到5个结果,如果其他用户使用更多的<pre>块,那么这个数字可能会改变。)

private static void Main(string[] args)
{
    var document = new HtmlDocument();
    using (var client = new WebClient())
    {
        var page = client.DownloadString("http://stackoverflow.com/questions/31894197");
        document.LoadHtml(page);
    }
    foreach (var node in document.DocumentNode.SelectNodes("//pre"))
    {
        Console.WriteLine(node.InnerText);
        Console.WriteLine("--------------------------");
    }

    Console.ReadLine();
}