我正在编写一个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 以找出为什么它可能没有页面上的“查询”对象。