我创建了一个功能" Query-ComDomElements.ps1"查询HTML对象。
当仅查询一个对象并再次查询时,这非常有效。
当我尝试在递归中调用它时它却失败了,我不明白为什么。代码/对象是完全相同的。
有人可以告诉我为什么查询.container>img
不起作用,但查询.container
和img
是什么?
查询两者时(因此递归调用函数)得到的错误是:
Exception calling "InvokeMember" with "5" argument(s): "Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))" At C:\path\to\Query-ComDomElements.ps1:31 char:5 + ... $result = [System.__ComObject].InvokeMember("getElementsB ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : COMException
此处我的示例脚本(函数Query-ComDomElements.ps1
未包含在github中):
. C:\path\to\Query-ComDomElements.ps1
$ie = New-Object -ComObject "InternetExplorer.Application"
$ie.Navigate2("https://www.gpunktschmitz.de/")
while($ie.Busy) {
Start-Sleep -Seconds 1
}
#this works
$imgContainer = Query-ComDomElements -Query '.container' -Dom $ie.Document
$image = Query-ComDomElements -Query 'img' -Dom $imgContainer -Property 'src'
#this fails
$image = Query-ComDomElements -Query '.container>img' -Dom $ie.Document -Property 'src'
$ie.quit()
答案 0 :(得分:2)
我认为问题正在发生,因为$dom
在第二次迭代传入时最终成为一个包含两个元素的数组。一个(脏)修复就是使用Select-Object
来获取第一个元素(建议使用Select
而不是[0]
,这样如果它不是数组就不会出错) :
if($SecondQuery -eq $false) {
if($Property -ne $false -and $Property -ne '*') {
return $result.$Property
} else {
return $result
}
} else {
return Query-ComDomElements -Query $SecondQuery -Dom ($result | select -first 1) -Property $Property
}