我正在使用Google的Apex系统进行在线课程,并希望能够自动保存某些页面的数据。正常浏览时登录和访问内容的过程如下:打开webapp并登录,导航我要查看的课程,单击课程。当我点击我想要的课程时,它会打开一个带有课程的新窗口。这是我无法用程序完成的部分。
我想到的第一种方法是使用PHP,请求网页并简单地保存它们。问题是有一个登录,以及一些我不知道如何使用php自动化的javascript事件和事情。我已经通过POST请求登录,但无法完成其余的工作。
今天我尝试使用dotnet WebBrowser控件使用Windows Forms,C#。我让它登录并导航到我需要选择要打开的课程的页面,但是如果我单击该链接,它会尝试在Internet Explorer中打开该网页。如果我使用它打开的链接,我会从网站收到错误。
检查我遇到问题的页面上的链接,我发现了打开新窗口的javascript事件。它通过重定向链接打开它。在新标签中使用此重定向链接而不是在Chrome中使用新窗口,但我不知道如何从C#获取重定向链接。 a
元素位于iframe中,我必须在那里获取链接。 How can I, in C#, retrieve an element from within an iframe?
另外,有更好的方法吗?
答案 0 :(得分:1)
使用WebClient类获取网址的HTML。
示例1:
string htmlTd;
using (WebClient client = new WebClient())
{
//or - request.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US)";
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
htmlTd = client.DownloadString(myurl);
}
GetImagesInHTMLString(htmlTd);
//从页面获取图片...由于我的修改,它现在有问题... 我正在努力,但帮助你实现目标..
private void GetImagesInHTMLString(string htmlString)
{
List<string> images = new List<string>();
string pattern = @"<(img)\b[^>]*>";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(htmlString);
string b =@"src=""";
string c=@"src="""+myurl+"";
//if (matches.Count >1)
//{
for (int i = 0, l =matches.Count; i < l; i++)
{
string pattern1 =@"s/\s*src='[^']*'//";
// images.Add(matches[i].Value.Replace(b, c));
string allmatch = matches[i].Value.Replace(b, c);
string patrern1="#(= src=['\"].+[^\"]?)?src=[\"']?([^\"']+)#i";
Regex rgx1 = new Regex(pattern1);
MatchCollection matches1 = rgx1.Matches(allmatch);
string siya = matches1[0].Value.ToString();
//string b = @"src=""";
//string c = @"src=""" + myurl + "";
}
// }
foreach (var item in images)
{
Response.Write(item);
}
}
WebClient类链接示例:
WebClient client = new WebClient ();
// Add a user agent header in case the
// requested URI contains a query.
client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Stream data = client.OpenRead (URl);
StreamReader reader = new StreamReader (data);
string s = reader.ReadToEnd ();
Console.WriteLine (s);
data.Close ();
reader.Close ();