本文主要介绍.NET(C#)中,后台代码中使用CsQuery框架,通过JQuery语法选择器处理解析Html或提取Html中指定的内容方法代码。CsQuery是.NET 4的jQuery端口。它实现了所有CSS2和CSS3选择器,jQuery的所有DOM操作方法,以及一些实用方法。大多数jQuery测试套件(截至1.6.2)已移植到C#。

1、CsQuery安装引用

官方地址https://github.com/jamietre/CsQuery

通过Nuget管理器,搜索"CsQuery" => 点击"安装"。

相关文档VS(Visual Studio)中Nuget的使用

2、CsQuery使用代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CsQuery;
using CsQuery.Web;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NUnit.Framework;
using Assert = NUnit.Framework.Assert;
using Description = NUnit.Framework.DescriptionAttribute;
using TestContext = Microsoft.VisualStudio.TestTools.UnitTesting.TestContext;
using System.Diagnostics;
namespace CsQuery.Tests.Examples
{
    ///<summary>
    ///     这个测试在默认情况下是禁用的,因为它访问公共web站点,激活它只是为了测试这个特性
    ///    </summary>
    [TestFixture, TestClass]
    public class YahooFinance : CsQueryTest
    {
        public override void FixtureSetUp()
        {
            base.FixtureSetUp();
            ServerConfig.Default.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
        }
        //[Test, TestMethod]
        public void YahooFinanceExample()
        {
            string URL = "http://finance.yahoo.com/q/op?s=MSFT&m=2012-09";
            CQ doc = CQ.CreateFromUrl(URL);
            // 这两个表有一个类“yfnc_datamodoutline1”,但是包装了一个内部表
            var rows = doc.Select(".yfnc_datamodoutline1 table tr");
           //在CsQuery中,索引器[]是用Select方法sysnoymous的
           //每个头行都有类"yfnc_tablehead1" -找出要使用哪个列
           //你感兴趣的四个部分
            var headers= rows.First().Find(".yfnc_tablehead1");
            int strikeIndex = headers.Filter(":contains('Strike')").Index();
            int symbolIndex = headers.Filter(":contains('Symbol')").Index();
            int bidIndex = headers.Filter(":contains('Bid')").Index();
            int askIndex = headers.Filter(":contains('Ask')").Index();
           //  遍历所有行,头行除外(“has”排除头行)
            foreach (var row in rows.Has("td")) {
                CQ cells = row.Cq().Find("td");
                string output = String.Format("Strike: {0} Symbol: {1} Bid: {2} ask: {3}",
                    cells[strikeIndex].Cq().Text(),
                    cells[symbolIndex].Cq().Text(),
                    cells[bidIndex].Cq().Text(),
                    cells[askIndex].Cq().Text());
           // CQ cq = CsQuery.CQ.CreateFromFile(path); 
           // string title = cq["body > div > p [style*='font-weight:bold']"].Text();
           // string content = cq["body > div > p [style*='text-decoration:underline']"].Text();
                Console.WriteLine(output);
            }

        }
    }
}

作者提供的注意事项: 

CsQuery未得到积极维护。我不再在日常工作中使用它,甚至在这些日子里甚至都没有在.NET中工作!因此,我很难花时间解决问题。如果您发布问题,我可能无法回复它们,并且我不太可能修复错误。
虽然NuGet(1.3.4)上的当前版本是稳定的,但是有一些已知的错误(请参阅问题),并且自存储库中的上一版本以来有许多更改。但是,我不打算发布任何正式版本,因为我没有时间验证当前的代码库并解决已知问题,或支持新版本可能出现的任何不可预见的问题。
我欢迎任何社区参与使这个项目再次活跃起来。如果您使用CsQuery并且有兴趣成为项目的合作者,请直接与我联系。
您还应该考虑使用AngleSharp,这是一个正在积极维护的新项目。它不是替代品,但提供类似的功能。

相关文档.Net(C#) Core安装使用AngleSharp解析html的方法及示例代码


推荐文档