【发布时间】:2010-10-21 18:44:56
【问题描述】:
我想编写一个 C# 程序(纯粹用于教育目的),它可以自动完成位于指定 URL 的 HTML 表单。问题是我不知道这是否可能,或者我该如何开始?我想下载 HTML,将其解析为表单元素的名称,然后使用必要的参数在该 URL 上进行 GET。这是个好主意吗?
【问题讨论】:
我想编写一个 C# 程序(纯粹用于教育目的),它可以自动完成位于指定 URL 的 HTML 表单。问题是我不知道这是否可能,或者我该如何开始?我想下载 HTML,将其解析为表单元素的名称,然后使用必要的参数在该 URL 上进行 GET。这是个好主意吗?
【问题讨论】:
见System.Net.WebRequest。您可以使用它来发出 GET 请求,其中变量编码在 URL 中,或 POST 请求,其中变量进入请求正文。表单的 HTML 源代码将告诉您要发出哪种类型的请求。
如果表单的结构没有改变,您不需要在运行时下载或解析表单本身:您可以在构建 GET 或 POST 请求时在程序中对变量名称进行硬编码.
【讨论】:
您的总体想法是正确的,尽管通常 HTML 表单将执行返回服务器的 POST 而不是 GET。请参阅 this question 以获取 C# 中提供参数的 Web 请求的示例代码。特别注意告诉你添加 request.Method = "POST"; 的评论因为这会改变来自 GET 的请求。 (您可以通过查看其开始标记中的方法来判断表单是 GET 还是 POST。这个:
<form id="form" action="..." method="post">
是一个 POST 表单。没有声明的方法意味着它是一个 GET)
更复杂的问题是解析 HTML 以查找元素。这是一个棘手的问题,因为 HTML 标准的松散性意味着您不能简单地将其视为 XML 文档并以这种方式进行解析,相反,您必须想出一种更宽容的方法。在这个网站 (this for example) 上有几个关于如何做到这一点的问题,这是一个常见的问题,所以谷歌无疑会给你一些线索。
如果我正在处理这个问题,我会先让 Web 请求使用已知的表单(这样您就可以跳过解析),一旦您对从服务器发送和检索数据感到满意,就会担心这部分。
【讨论】:
WatiN 会为您执行此操作,它会自动执行 IE 以进行测试。但我用它来筛选刮东西。效果很好。
[Test]
public void SearchForWatiNOnGoogle()
{
using (IE ie = new IE("http://www.google.com"))
{
ie.TextField(Find.ByName("q")).TypeText("WatiN");
ie.Button(Find.ByName("btnG")).Click();
Assert.IsTrue(ie.ContainsText("WatiN"));
}
}
【讨论】:
Dave Ward 写了一篇很棒的文章,主要围绕使用 AJAX 回发到页面方法。这个想法是将响应对象序列化为 JSON 并使用 jQuery 显示在客户端上。这篇文章写得很好,有一个很好的例子,可以应用于你的情况。
如果您通读这篇文章,您会发现您的想法与他的策略一致。 Dave 的网站上有许多很酷的文章,它们融合了 Asp.net、AJAX 和使用 jQuery 和 Javascript 的客户端技术。
【讨论】:
听起来像是涉及表单提交的屏幕/网络抓取。您可能想查看我对this question 的回复。
【讨论】: