自动从网站下载数据

自动从网站下载数据

我正在编写一个powershell脚本来OpenStreetMap自动提取某个国家的数据。我的整个脚本都写好了,但功能不太好。我的脚本如下:

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $true
$ie.Navigate("https://www.openstreetmap.org/#map=9/41.5640/21.5173")

do {    
Start-Sleep -Seconds 1
} until($ie.Busy -eq $true -or $ie.ReadyState -ne 4) 

$ie.document.getElementById("query").value = "North Macedonia"
$ie.document.getElementsByName("commit")[0].click()

Start-Sleep -Seconds 1
Start-Sleep -Seconds 1

$selectedcountry = $ie.Document.getElementsByTagName("a") | Where-Object {$_.innerText -eq "North Macedonia"}
$selectedcountry.click()

Start-Sleep -Seconds 1
Start-Sleep -Seconds 1

$download = $ie.Document.getElementsByTagName("a") | Where-Object {$_.innerText -eq "Download XML"}
$download.click()

有时可以,有时不行。例如,有时我会收到以下错误:

PS C:\Users\user> $ie.document.getElementById("query").value = "North Macedonia"

You cannot call a method on a null-valued expression.

At line:1 char:1

+ $ie.document.getElementById("query").value = "North Macedonia"

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (:) [], RuntimeException

+ FullyQualifiedErrorId : InvokeMethodOnNull

如果我逐块运行该脚本,它就可以完全发挥作用。然而,这并不是脚本的重点。

有人能解释一下为什么会发生这种情况吗?如果让我猜的话,我会说我必须实现某种事件处理程序。此外,欢迎任何其他改进和更好的做法。提前致谢。

答案1

我认为@Lee_Dailey 的答案更好,也是我会使用的答案,但脚本基本上告诉您,无论出于何种原因,您尝试加载的页面中没有“查询”对象。您可以尝试以下方法:

if (-not $ie.document.getElementById('query')) {
  $ie.document.<get the HTML> | Out-File -Path 'c:\some\path\output.html'
}

我自己没有使用过 InternetExplorer ComObject,因此您必须自己找出如何获取 HTML。一旦您有了它,您就可以检查 HTML 以找出为什么它可能没有页面上的“查询”对象。

相关内容