用C#提取html元素的值

时间:2012-10-19 23:39:10

标签: c# regex xml-parsing

在Wordpress生成的页面中,有以下元标记:

<meta name="generator" content="WordPress 3.4.2" />

我正在寻找一种轻松提取的方法,“3.4.2”(在上面的例子中)

使用XmlDocument或Regular Expression会更快吗?

我找到了JSoup,但这对我正在尝试做的事情来说太过分了。

修改

只是为了澄清 - 我不想包含任何外部库 此外,这是在类库中运行,因此使用powershell也不是一个选项。

4 个答案:

答案 0 :(得分:3)

由于您没有尝试匹配配对标签或任何内容,正则表达式应该没问题。只需搜索content="WordPress (\d\.\d\.\d)或类似内容。 (如果它确实一致,您可以搜索整个meta标记。)

尝试将HTML页面解析为XmlDocument可能无法解决;并非所有有效(或浏览器支持的)HTML都是有效的XML。

答案 1 :(得分:1)

利用HTML Agility Pack解析HTML

enter image description here

编辑(要复制的代码)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;

namespace HTMLAgilityExample
{
    class Program
    {
        static void Main(string[] args)
        {
            string contentValue;

            HtmlDocument document = new HtmlDocument();
            document.Load("C:/test.html");
            foreach(HtmlNode link in document.DocumentNode.SelectNodes("//meta[@content]"))
            {
                HtmlAttribute attribute = link.Attributes["content"];
                if(attribute.Value.Contains("WordPress"))
                {
                    contentValue = attribute.Value.Replace("WordPress", "").Trim();
                }
            }
        }
    }
}

答案 2 :(得分:1)

我想,因为你必须从属性值中解析出版本,并且因为听起来你不想在此任务之外进行任何广泛的HTML解析,所以我建议使用正则表达式。

这应该给你一个开始。表达式可以简化一点;也许没有必要指定属性值在元标记内。或者它可以收紧一点;也许最好指定“内容”属性。无论哪种方式,这都适用于我的快速测试。

请注意,为了更好的可读性,我喜欢在正则表达式中留下空格并包含IgnorePatternWhitespace选项。

var html = ""; // Populate the html string here

var options = RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace;
var regx = new Regex( "<meta\\s+? .*? WordPress\\s*? (?<version> [\\d\\.]+) [^\\d\\.] .*? />", options );

var match = regx.Match( html );

if ( match.Success ) {
    var version = match.Groups["version"].Value;
}

答案 3 :(得分:0)

你可以使用powershell:

PS> [xml]$xml = '<meta name="generator" content="WordPress 3.4.2" />'
PS> ($xml.meta.content) -match "[\d\.]+"
True
PS> $matches[0]
3.4.2