C# 解析URL

        string server = "www.google.com.hk";
        private void SearchButton_Click(object sender, EventArgs e)
        {           
            var ipas = Dns.GetHostAddresses(server);
            var response = "";
            using (var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
            {
               
                sock.Connect(ipas[0], 80);

                try
                {
                    var keyword = Uri.EscapeDataString(this.KeywordTextBox.Text);
                    sock.Send(Encoding.Default.GetBytes(string.Format("GET /search?q={0}&ie=utf-8&oe=utf-8 HTTP/1.1\r\nHost: {1}\r\nConnection: Close\r\n\r\n", keyword, server)));

                    var buf = new byte[1024];
                    var readsize = 0;
                    do
                    {
                        readsize = sock.Receive(buf);
                        response += Encoding.UTF8.GetString(buf);
                    } while (readsize > 0);


                        Array.ForEach<string[]>((new HtmlParser()).Parse(response).ToArray(), (_) => { table.Rows.Add(_); });

                }
                finally
                {
                    sock.Disconnect(false);
                }
            }           

        }

 

 

  /// <summary>
    /// HTMLパーサ
    /// </summary>
    public class HtmlParser
    {
        /// <summary>
        /// パース実行
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public IEnumerable<string[]> Parse(string source)
        {
            // htmlヘッダ部分を除去
            var lines = source.Split(new string[] { "\r\n" }, StringSplitOptions.None).SkipWhile(s => !s.StartsWith("<"));
            var html = lines.ToArray()[0];

            // XDocumentに加工
            using (var sgmlReader = new SgmlReader { DocType = "HTML", CaseFolding = CaseFolding.ToLower })
            {
                sgmlReader.InputStream = new StringReader(html);
                var xml = XDocument.Load(sgmlReader);

                // 項目リンク部分を取り出し
                var query =
                    from ele in xml.Elements().Descendants()
                    where ele.Attribute("class") != null && ele.Attribute("class").Value == "g"
                    select ele.Element("h3");

                // リンクurl整形用
                var regex = new Regex(@"/url\?q=(.*)\&sa");

                foreach (var item in query)
                {
                    if (item != null)
                    {
                        var mc = regex.Matches(item.Element("a").Attribute("href").Value);
                        if (mc.Count > 0)
                        {
                            var url = mc[0].Groups[1].Value;
                            yield return new string[] { item.Element("a").Value, url };
                        }
                    }
                }
            }
        }
    }

 

参考

WEB页面抓取

http://www.cnblogs.com/lumnm/archive/2009/12/23/1630435.html

HTML解析

http://developer.51cto.com/art/200909/149097.htm


### 使用 C# 解析 URL 信息的方法与代码示例 在 C# 中,解析 URL 信息可以通过 `System.Uri` 和 `System.Web.HttpUtility` 类实现。以下是一个详细的解析方法和代码示例。 #### 方法一:使用 `Uri` 类解析 URL `Uri` 类可以解析 URL 的各个部分,例如协议、主机名、路径和查询参数等。通过 `Uri.Query` 属性可以获取查询字符串,并结合 `HttpUtility.ParseQueryString` 方法解析查询参数。 ```csharp using System; using System.Collections.Specialized; class Program { static void Main() { string url = "https://example.com/page?id=123&category=books"; Uri uri = new Uri(url); Console.WriteLine("协议: " + uri.Scheme); // 输出协议 Console.WriteLine("主机: " + uri.Host); // 输出主机名 Console.WriteLine("端口: " + uri.Port); // 输出端口 Console.WriteLine("路径: " + uri.AbsolutePath); // 输出路径 // 解析查询参数 NameValueCollection queryParams = System.Web.HttpUtility.ParseQueryString(uri.Query); foreach (string key in queryParams.AllKeys) { Console.WriteLine($"{key}: {queryParams[key]}"); } } } ``` 上述代码中,`Uri` 对象用于解析 URL 的基本组成部分,而 `HttpUtility.ParseQueryString` 方法则用于解析查询字符串[^1]。 #### 方法二:使用 `UriBuilder` 类解析和修改 URL 如果需要同时解析和修改 URL,可以使用 `UriBuilder` 类。它提供了对 URL 各个部分的便捷访问和修改功能。 ```csharp using System; class Program { static void Main() { string originalUrl = "https://www.example.com/page?id=123&category=books"; Uri originalUri = new Uri(originalUrl); UriBuilder uriBuilder = new UriBuilder(originalUri); Console.WriteLine("原始URL: " + originalUri.ToString()); // 修改 URL 的某些部分 uriBuilder.Host = "www.newdomain.com"; uriBuilder.Path = "/newpage"; uriBuilder.Query = "newparam=value"; Console.WriteLine("修改后的URL: " + uriBuilder.ToString()); } } ``` 此代码展示了如何使用 `UriBuilder` 类解析并修改 URL 的不同部分[^2]。 #### 方法三:使用 `HttpClient` 获取和解析 URL 数据 如果需要从远程服务器获取 URL 数据并解析,可以结合 `HttpClient` 和 `HttpUtility` 使用。 ```csharp using System; using System.Net.Http; using System.Threading.Tasks; using System.Collections.Specialized; class Program { static async Task Main() { using (HttpClient client = new HttpClient()) { string url = "https://example.com/page?id=123&category=books"; HttpResponseMessage response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine("响应内容: " + responseBody); // 解析查询参数 Uri uri = new Uri(url); NameValueCollection queryParams = System.Web.HttpUtility.ParseQueryString(uri.Query); foreach (string key in queryParams.AllKeys) { Console.WriteLine($"{key}: {queryParams[key]}"); } } } } ``` 此代码展示了如何使用 `HttpClient` 获取远程 URL 数据,并通过 `HttpUtility.ParseQueryString` 解析查询参数[^3]。 ### 注意事项 - 在使用 `HttpClient` 时,建议创建单例实例以避免端口耗尽问题。 - 如果项目未引用 `System.Web` 命名空间,则需要手动添加对 `System.Web` 的引用以使用 `HttpUtility`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值