C# 解析URL

來源:互聯網
上載者:User

        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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.