在表单上使用Httpwebrequest获取用于报废的表时出现意外行为

时间:2012-07-15 10:29:12

标签: vb.net httpwebrequest html-agility-pack

我正在尝试用一个用PHP编写的网站来从特定的表中提取一些信息。这是场景。

在着陆页上有一个表单,可以从用户那里获取查询并根据搜索结果进行查询。如果我忽略这些字段并点击“提交”,它将产生整个结果(这是我感兴趣的)。在我不了解HTTPWebRequest类之前,我只是将URL传递给HtmlAgilityPack库中的Htmlweb.load(URL)方法,显然不是那样。

然后我搜索了HTTPWebRequest,我找到了一个像这样的例子

    Dim cookies As New CookieContainer
    Dim postData As String = "postData obtained using live httpheaders pluging in firefox"
    Dim encoding As New UTF8Encoding
    Dim byteData As Byte() = encoding.GetBytes(postData)


    Dim postRequest As HttpWebRequest = DirectCast(WebRequest.Create("URL"), HttpWebRequest)
    postRequest.Method = "POST"
    postRequest.KeepAlive = True
    postRequest.CookieContainer = cookies
    postRequest.ContentType = "application/x-www-form-urlencoded"
    postRequest.ContentLength = byteData.Length
    postRequest.Referer = "Referer Page"
    postRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"

    Dim postreqstream As Stream = postRequest.GetRequestStream()
    postreqstream.Write(byteData, 0, byteData.Length)
    postreqstream.Close()
    Dim postresponse As HttpWebResponse

    postresponse = DirectCast(postRequest.GetResponse(), HttpWebResponse)
    cookies.Add(postresponse.Cookies)
    Dim postreqreader As New StreamReader(postresponse.GetResponseStream())

    Dim thepage As String = postreqreader.ReadToEnd

现在当我以vb格式将页面变量输出到浏览器时,我可以看到我想要的页面(包含表格)。此时我只是将该页面的URL传递给htmlagilitypack,就像这样

    Dim web As New HtmlAgilityPack.HtmlWeb()
    Dim htmlDoc As HtmlAgilityPack.HtmlDocument = web.Load("URL")
    Dim tabletag As HtmlNodeCollection = htmlDoc.DocumentNode.SelectNodes("//table")
    Dim tablenode As HtmlNode = htmlDoc.DocumentNode.SelectSingleNode("//table[@summary='List of services']")

    If Not tabletag Is Nothing Then

        Console.WriteLine("YES")

    End If

但是tabletag变量没什么。我想知道我哪里出错了?无论如何也是从httpwebrespone直接获取URL所以我可以传入web.load方法?

谢谢

1 个答案:

答案 0 :(得分:0)

如果您想要的内容是通过JavaScript构建的,则无法通过HtmlAgilityPack Load方法或任何简单的URL加载器客户端(如WebRequest)运行JavaScript。它们不会处理,也不会像浏览器那样与网页进行交互。否则你可以直接从你的流加载:

Dim htmlDoc As New HtmlAgilityPack.HtmlDocument
htmlDoc.Load(postresponse.GetResponseStream())

第一个建议:您可以在WebBrowser中加载表单页面URL,然后管理填写表单并单击提交按钮,以编程方式通过DOM访问HTMLDocument。有关thisthis等帖子的详细信息。

第二个建议:当您不想在屏幕上或在最糟糕的情况下,当您想要在后台线程中操作网页时,WebBrowser会有一点棘手。在这种情况下,您可以使用STAThread solution herehere或使用其中一个已调用的无头浏览器,如Selenium或HtmlUnit,WatiN,并使用其DOM访问权限执行相同操作。