在C#中使用Regex获取外部页面并解析元标记?

时间:2010-12-06 19:50:40

标签: c# httpwebrequest meta-tags

请考虑以下代码:

public ActionResult Index(String URLQuery = "http://www.google.com")
    {

        HttpWebRequest webRequest;
        HttpWebResponse webResponse;

        int bufCount = 0;
        byte[] byteBuf = new byte[1024];
        String queryContent = "";


        webRequest = (HttpWebRequest) WebRequest.Create(URLQuery);
        webRequest.Timeout = 10*1000;
        webRequest.KeepAlive = false;
        webRequest.ContentType = "text/html";

        webResponse = (HttpWebResponse) webRequest.GetResponse();

        StreamReader responseStream = new StreamReader(webResponse.GetResponseStream(), System.Text.Encoding.UTF8);

        queryContent = responseStream.ReadToEnd();

        ViewData["StreamResult"] = queryContent;            
        return View();
    }

基本上,这只是抓取一个网页并按原样吐出。我想做的是从屏幕上获取生成的获取数据,并解析它,就像PHP允许你使用某种内置的DOM对象/框架。我已经看到很多Regex的例子来完成这个任务,但我觉得这样做效率很低,导致太多奇怪的边缘情况可能导致我的数据损坏。

这甚至可能吗?我注定要使用正则表达式吗?

2 个答案:

答案 0 :(得分:1)

你应该使用解析器 - 看起来HTML agility pack会做你想要的。

答案 1 :(得分:1)

使用HtmlAgility Pack,您可以轻松完成此操作。在使用XPath的示例下面,较新的版本也支持Linq语法,但我还没有亲自尝试过。

    StreamReader responseStream = new StreamReader(webResponse.GetResponseStream(), 
                                                   System.Text.Encoding.UTF8);

        queryContent = responseStream.ReadToEnd();
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(queryContent);
        HtmlNode bodyNode = doc.DocumentNode.SelectSingleNode("//body | //BODY");
        /* do processing here */