我正在尝试用一个用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方法?
谢谢
答案 0 :(得分:0)
如果您想要的内容是通过JavaScript构建的,则无法通过HtmlAgilityPack Load方法或任何简单的URL加载器客户端(如WebRequest)运行JavaScript。它们不会处理,也不会像浏览器那样与网页进行交互。否则你可以直接从你的流加载:
Dim htmlDoc As New HtmlAgilityPack.HtmlDocument
htmlDoc.Load(postresponse.GetResponseStream())
第一个建议:您可以在WebBrowser中加载表单页面URL,然后管理填写表单并单击提交按钮,以编程方式通过DOM访问HTMLDocument。有关this和this等帖子的详细信息。
第二个建议:当您不想在屏幕上或在最糟糕的情况下,当您想要在后台线程中操作网页时,WebBrowser会有一点棘手。在这种情况下,您可以使用STAThread solution here和here或使用其中一个已调用的无头浏览器,如Selenium或HtmlUnit,WatiN,并使用其DOM访问权限执行相同操作。