请考虑以下代码:
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的例子来完成这个任务,但我觉得这样做效率很低,导致太多奇怪的边缘情况可能导致我的数据损坏。
这甚至可能吗?我注定要使用正则表达式吗?
答案 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 */