以下图是效果图:右边添加两个Web联合结果部件,分别连接百度和Google搜索。

OpenSearchBase类----抽象类父类
public abstract class OpenSearchBase : LayoutsPageBase
{
//搜索单词参数
public string SearchTerm
{
get
{
//根据网站的编码不同而获取的也不同
if (Request.Cookies.Get("encoding").Value == "gb2312")
{
string query = Page.Request["q"];
query = UrlEncode(query);
return query;
}
else
{
return Page.Request["q"];
}
}
}
//Url转码
public static string UrlEncode(string input)
{
if (input == null || "".Equals(input)) return "";
StringBuilder sb = new StringBuilder();
byte[] byStr = System.Text.Encoding.Default.GetBytes(input);
for (int i = 0; i < byStr.Length; i++)
{
sb.Append(@"%" + Convert.ToString(byStr[i], 16));
}
return (sb.ToString());
}
//显示搜索条数参数
public int Count
{
get
{
return Convert.ToInt32(Page.Request["count"]);
}
}
//获取搜索结果列表XML格式
public string GetResultsXML(string searchURL, string searchTerm, string selectNodes)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(searchURL);
CookieContainer cookie = new CookieContainer();
request.CookieContainer = cookie;
WebResponse response = request.GetResponse();
HtmlDocument doc = new HtmlDocument();
try
{
if (response.ContentType == null || response.ContentType.ToLower().Contains("utf-8") || response.ContentType.ToLower().Contains("big5"))
{
//Google
HtmlWeb hw = new HtmlWeb();
doc = hw.Load(searchURL);
}
else if (response.ContentType.ToLower().Contains("gb2312") || response.ContentType.ToLower().Contains("gbk"))
{
//Baidu
request.Method = "GET";
Stream rss = response.GetResponseStream();
doc.Load(rss);
}
//Begin writing the RSS document
StringBuilder resultsXML = new StringBuilder();
resultsXML.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
resultsXML.Append("<rss version=\"2.0\">");
resultsXML.AppendFormat("<channel><title></title><link/><description/><ttl>60</ttl>", searchTerm);
HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(selectNodes);
foreach (HtmlNode htmlNode in nodeCollection)
{
string link = "";
string title = "";
string desc = "";
StringWriter descWriter = new StringWriter();
StringWriter titleWriter = new StringWriter();
StringWriter linkWriter = new StringWriter();
foreach (HtmlNode subNode in htmlNode.ChildNodes)
{
//在XML内容中找到标题(title),URL地址(link),描述(desc)和节点(subNode)
string[] ltd = FindResultItems(link, title, desc, subNode);
link = ltd[0];
title = ltd[1];
desc = ltd[2];
}
Server.HtmlEncode(desc, descWriter);
string encDescription = descWriter.ToString();
if (encDescription == "")
{
encDescription = "不能正常显示信息,如图片等";
}
Server.HtmlEncode(title, titleWriter);
string encTitle = titleWriter.ToString();
Server.HtmlEncode(link, linkWriter);
string encLink = linkWriter.ToString();
resultsXML.AppendFormat("<item><title>{0}</title><link>{1}</link><description>{2}</description><pubDate>2010-10-10</pubDate></item>", encTitle, encLink, encDescription);
}
//Complete RSS document
resultsXML.Append("</channel></rss>");
return resultsXML.ToString();
}
catch (Exception ex1)
{
StringBuilder errorXML = new StringBuilder();
errorXML.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
errorXML.Append("<rss version=\"2.0\">");
//errorXML.Append("<channel><title>没有合适的结果</title><link/><description/><pubDate/>");
errorXML.Append("<channel><title>错误信息</title><link/><description/><pubDate/>");
errorXML.AppendFormat("<item><title>错误信息</title><link/><description>{0}</description><pubDate/></item>", ex1.ToString());
errorXML.Append("</channel></rss>");
return errorXML.ToString();
}
finally
{
response.Close();
}
}
//在XML内容中找到标题(title),URL地址(link),描述(desc)和节点(subNode)
public abstract string[] FindResultItems(string link, string title, string desc, HtmlNode subNode);
}
百度BaiduSearch类
public partial class BaiduSearch : OpenSearchBase
{
protected override void Render(HtmlTextWriter writer)
{
//创建Cookie,因百度网站的编码是GB2312,设Cookie为gb2312
HttpCookie cookie = new HttpCookie("encoding", "gb2312");
Request.Cookies.Add(cookie);
//获取搜索词
string searchTerm = base.SearchTerm;
if (string.IsNullOrEmpty(searchTerm)) return;
//获取搜索个数
int count = base.Count;
//构建URL地址
string searchURL = string.Format("http://www.baidu.com/s?wd={0}&rn={1}", searchTerm, count);
Response.ContentType = "text/xml";
//用HTMLTextWriter对象写出RSS文档
writer.Write(base.GetResultsXML(searchURL, searchTerm, "//td[@class='f']"));
}
//重写FindResultItems方法
public override string[] FindResultItems(string link, string title, string desc, HtmlNode subNode)
{
string[] ltd = new string[3];
ltd[0] = link;
ltd[1] = title;
ltd[2] = desc;
if (subNode.Name == "a")
{
ltd[0] = subNode.Attributes["href"].Value;
ltd[1] = subNode.InnerText.ToString();
}
if (subNode.Name == "font")
{
string descHtml = subNode.InnerHtml;
try
{
ltd[2] = descHtml.Substring(0, descHtml.IndexOf("<br>"));
}
catch
{
ltd[2] = "不能正常显示...比如含有图片...";
}
}
return ltd;
}
}
谷歌GoogleSearch类
public partial class GoogleSearch : OpenSearchBase
{
protected override void Render(HtmlTextWriter writer)
{
//设置Cookie为utf-8
HttpCookie cookie = new HttpCookie("encoding", "utf-8");
Request.Cookies.Add(cookie);
//获取搜索词和搜索个数,并创建搜索地址URL
string searchTerm = base.SearchTerm;
if (string.IsNullOrEmpty(searchTerm)) return;
int count = base.Count;
string searchURL = string.Format("http://www.google.com.hk/search?hl=zh-cn&q={0}", searchTerm);
if (count != 0)
{
searchURL = searchURL + string.Format("&num={0}", count);
}
Response.ContentType = "text/xml";
//用HTMLTextWriter对象写出RSS文档
writer.Write(base.GetResultsXML(searchURL, searchTerm, "//li[@class='g']"));
}
//重写FindResultItems方法
public override string[] FindResultItems(string link, string title, string desc, HtmlNode subNode)
{
string[] ltd = new string[3];
ltd[0] = link;
ltd[1] = title;
ltd[2] = desc;
//Find the list that contains the result items
if (subNode.Name == "h3")
{
foreach (HtmlNode lineItemNode in subNode.ChildNodes)
{
ltd[0] = lineItemNode.Attributes[0].Value;
ltd[1] = lineItemNode.InnerText.ToString();
}
}
if (subNode.Name == "div")
{
string descHtml = subNode.InnerHtml;
try
{
ltd[2] = descHtml.Substring(0, descHtml.IndexOf("<br>"));
}
catch
{
ltd[2] = "有图片,不能显示。。。";
}
}
return ltd;
}
}