WebBrowser小示例(二)
接下来我们对已经登录的校内网页进行数据读取:
接示例(一)中的操作,我们已经进入了校内官方个人首页,能看到在导航条的右侧有个搜索框,我们下面要完成的任务就是在winform页面中输入我们要搜索人的姓名,然后从结果页面中读取我们所要的信息:同示例(一)中一样,我们取得搜索文本框的id或name并生成HtmlElment对象并执行查询:
代码
string key = txtkey.Text.ToString();
if (key == "")
return;
HtmlElement search = webBrowser1.Document.All["navSearchInput"];
HtmlElement btn = webBrowser1.Document.All["navSearchSubmit"];
if (search == null || btn == null)
return;
search.SetAttribute("value", key);
btn.InvokeMember("click");
if (key == "")
return;
HtmlElement search = webBrowser1.Document.All["navSearchInput"];
HtmlElement btn = webBrowser1.Document.All["navSearchSubmit"];
if (search == null || btn == null)
return;
search.SetAttribute("value", key);
btn.InvokeMember("click");
为避免页面刷新不完整会出现异常,我们可以用WebBrowser的DocumentCompleted和Navigated事件,前者在页面加载完毕时执行,后者在加载开始时执行,我们可以在这两个事件中设置一个初始值为0r 公有整形变量count,在执行Navigated时加1,在执行DocumentCompleted减1,如果count为0我们就读取页面:
代码
private void webPage_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
count++;
}
private void webPage_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
count--;
//因为我们搜索出来的校友都是以姓名:**** 资料: *** 的形式显示所以可以使用string的split()函数截取。
if (count == 0)
{
//list-results 结果集div的id
string innerText = this.webBrowser1.Document.GetElementById("list-results").InnerText;
innerText = innerText.Replace("\r\n", "");
string[] strInnerText= innerText.Split(new string[] { "姓名:", " 资料:" }, StringSplitOptions.RemoveEmptyEntries);
ArrayList ar = new ArrayList();
if (strInnerText.Length > 0)
{
for (int i = 0; i < strInnerText.Length; i++)
{
//去除掉不需要的字符
if (strInnerText[i].Contains("加为好友发站内信"))
strInnerText[i] = strInnerText[i].Replace("加为好友发站内信", "");
ar.Add(strInnerText[i]);
//MessageBox.Show(ar[i].ToString());
if(i%2!=0)
txtinfo.Text += "姓名:"+ar[i].ToString() + "\r\n";
else if (i % 2 == 0 &&ar[i].ToString()!=txtkey.Text.ToString()&&ar[i].ToString()!="")
txtinfo.Text += "学校:" + ar[i].ToString() + "\r\n";
else
{
txtinfo.Text += "姓名:" + ar[i].ToString() + "\r\n";
}
}
}
}
}
{
count++;
}
private void webPage_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
count--;
//因为我们搜索出来的校友都是以姓名:**** 资料: *** 的形式显示所以可以使用string的split()函数截取。
if (count == 0)
{
//list-results 结果集div的id
string innerText = this.webBrowser1.Document.GetElementById("list-results").InnerText;
innerText = innerText.Replace("\r\n", "");
string[] strInnerText= innerText.Split(new string[] { "姓名:", " 资料:" }, StringSplitOptions.RemoveEmptyEntries);
ArrayList ar = new ArrayList();
if (strInnerText.Length > 0)
{
for (int i = 0; i < strInnerText.Length; i++)
{
//去除掉不需要的字符
if (strInnerText[i].Contains("加为好友发站内信"))
strInnerText[i] = strInnerText[i].Replace("加为好友发站内信", "");
ar.Add(strInnerText[i]);
//MessageBox.Show(ar[i].ToString());
if(i%2!=0)
txtinfo.Text += "姓名:"+ar[i].ToString() + "\r\n";
else if (i % 2 == 0 &&ar[i].ToString()!=txtkey.Text.ToString()&&ar[i].ToString()!="")
txtinfo.Text += "学校:" + ar[i].ToString() + "\r\n";
else
{
txtinfo.Text += "姓名:" + ar[i].ToString() + "\r\n";
}
}
}
}
}
这样一个简单的页面截取就完成了。接下来继续讨论