我看到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它进入了他们的代码。
答案 0 :(得分:1)
好吧,如果你想剥离 HTML并且你已经尝试(没有成功)正则表达式,那么我必须为我自己的项目投入一个你应该可以使用的。 / p>
/(<\/?(pre|span)[\s\S]*?>)|((style|class|id|lang|) ?\= ?['"][\s\S]*?['"])/gi
这是来自Javascript文件,因此C#中的包装可能不同,但实际表达式应该匹配。根据需要调整。
答案 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();
}