Asp.net 使用Excel VBA从aspx页面的表格中检索数据

Asp.net 使用Excel VBA从aspx页面的表格中检索数据,asp.net,vba,excel,http,Asp.net,Vba,Excel,Http,我正在尝试使用excel vba从aspx页面检索表数据。我知道如何从URL获取表数据,但主要问题如下 问题 有一个aspx页面(如www.abc.aspx)。我当前在此页面上。请将此页面设置为page1 现在我单击当前页面上的page2链接。值得注意的是,单击此链接后,旧URL(www.abc.aspx)不会更改,但内容会更改。(内容为page2) 如果查看第1页的源代码 <form method="post" action="page1 url" id="Form1"> 无

我正在尝试使用excel vba从aspx页面检索表数据。我知道如何从URL获取表数据,但主要问题如下

问题

有一个aspx页面(如www.abc.aspx)。我当前在此页面上。请将此页面设置为page1

现在我单击当前页面上的page2链接。值得注意的是,单击此链接后,旧URL(www.abc.aspx)不会更改,但内容会更改。(内容为page2

如果查看第1页的源代码

<form method="post" action="page1 url" id="Form1">

无论第1页上的操作是什么(第2页单击),它都会发回相同的第1页url

既然我不知道excel VBA中的页面2表格的URL,那么我如何才能在其中获取数据呢

代码

这就是我用来获取表数据的东西

我使用internet explorer对象,然后导航到链接并将文档保存在htmldoc中

ie.navigate "url"

Do While ie.READYSTATE <> READYSTATE_COMPLETE
Application.StatusBar = "Fetching data..."
DoEvents
Loop

Set htmldoc = ie.document

'Column headers
Set eleColth = htmldoc.getElementsByTagName("th")
j = 0 'start with the first value in the th collection
        For Each eleCol In eleColth 'for each element in the td collection
            ThisWorkbook.Sheets(1).Range("A1").Offset(i, j).Value = eleCol.innerText 'paste the inner text of the td element, and offset at the same time
            j = j + 1 'move to next element in td collection
        Next eleCol 'rinse and repeat


'Content
Set eleColtr = htmldoc.getElementsByTagName("tr")

'This section populates Excel
    i = 0 'start with first value in tr collection
    For Each eleRow In eleColtr 'for each element in the tr collection
        Set eleColtd = htmldoc.getElementsByTagName("tr")(i).getElementsByTagName("td") 'get all the td elements in that specific tr
        j = 0 'start with the first value in the td collection
        For Each eleCol In eleColtd 'for each element in the td collection
            ThisWorkbook.Sheets(1).Range("D3").Offset(i, j).Value = eleCol.innerText 'paste the inner text of the td element, and offset at the same time
            j = j + 1 'move to next element in td collection
        Next eleCol 'rinse and repeat
        i = i + 1 'move to next element in td collection
    Next eleRow 'rinse and repeat

ie.Quit
Set ie = Nothing
ie.navigate“url”
在ie.READYSTATE READYSTATE\u完成时执行此操作
Application.StatusBar=“正在提取数据…”
多芬特
环
设置htmldoc=ie.document
'列标题
Set eleColth=htmldoc.getElementsByTagName(“th”)
j=0'从第th个集合中的第一个值开始
对于eleColth中的每个eleCol,对于td集合中的每个元素
ThisWorkbook.Sheets(1).Range(“A1”).Offset(i,j).Value=eleCol.innerText“粘贴td元素的内部文本,同时偏移
j=j+1'移动到td集合中的下一个元素
下一步,eleCol'冲洗并重复
"内容",
Set eleColtr=htmldoc.getElementsByTagName(“tr”)
'此部分填充Excel
i=0'从tr集合中的第一个值开始
对于eleColtr中的每个eleRow'对于tr集合中的每个元素
Set eleColtd=htmldoc.getElementsByTagName(“tr”)(i).getElementsByTagName(“td”)获取该特定tr中的所有td元素
j=0'从td集合中的第一个值开始
对于eleColtd中的每个eleCol,对于td集合中的每个元素
ThisWorkbook.Sheets(1).Range(“D3”).Offset(i,j).Value=eleCol.innerText“粘贴td元素的内部文本,同时偏移
j=j+1'移动到td集合中的下一个元素
下一步,eleCol'冲洗并重复
i=i+1'移动到td集合中的下一个元素
下一步,冲洗并重复
即退出
设置ie=无
编辑:

示例

如果我们点击堆栈溢出()中的问题 现在点击问题第2页(新链接是?page=2&sort=newest)

在我的例子中,如果我们单击第2页,新链接不会更新。它是相同的旧链接

编辑:我在这里发现了一个类似的问题


谢谢。

好吧,我很同情,有一个学派(包括)认为每个单独的页面都应该有自己的URI和

但是网站管理员可以而且确实会把你弄得一团糟。它们可以重定向您的HTTP请求,并且可以像您的情况一样混淆导航。他们可以重写HTTP请求

你有两个选择

选项1-让Internet Explorer为您解析新内容

因此,如果内容在屏幕上可见,那么它必须在文档对象模型(DOM)中。在IE或Chrome中,可以右键单击并获得上下文菜单,然后选择Inspect查看元素在DOM中的位置

我认为你的代码展示了足够的专业知识来深入研究。然而,有时一些网站喜欢禁用Inspect菜单选项,以避免编程人员四处闲逛。(编辑:如您的情况,我已经阅读了评论)

选项2-使用像Fiddler这样的HTTP嗅探工具来检测HTTP重定向/重写

正如我上面所说的,HTTP请求可以由web服务器重写和重定向,但不能通过web服务器。有一些工具可以检测到这一点。一个流行的工具是,今天我发现有一个特定的

老实说,虽然开发工具与浏览器本身,特别是Chrome(CTRL+Shift + I,然后网络选项卡),显示网络流量的细节水平越来越与任何嗅探工具相媲美。


很抱歉你被否决了,这似乎是一个非常合理的问题。

对这个问题的鸟瞰:

你有一个你似乎无法放弃的要求: 使用excelvba。 我强调这一点,因为答案常常提供满足OP中发布的替代前提的解决方案

可能的解决方案

因此,您必须将ExcelVBA与另一个能够显示html重定向或模糊URL内容的工具连接起来

GoogleChromeDeveloperTools显示所有内容,您可以使用。下载

它的用途相当广泛,例如,你可以看到

至于获取模糊的内容,有几个项目可能会有所帮助

(不是VBA,但很有用)

(注意:包装纸的作者通常很想用SO来回答,并且回答得很精确)

我猜YMMV,总是有人试图,用各种各样的技术,并且常常有很好的理由


如果您有一个真实的示例,它可能会有所帮助。

请添加一个。我在上面的问题中添加了检索表数据的代码。@MaximiliaInputers我现在也给出了一个示例。如果页面是纯html,那么第2页的数据应该已经加载,只是隐藏了。你应该能够得到它们。若页面使用一些动态引擎,比如Angular,那个么可能会更复杂,因为数据在附加的javascript文件中。您必须单击page2按钮或在JS文件中查找数据。@EganWolf It