小编The*_*tor的帖子

在PowerShell中的mshtml.HTMLDocumentClass对象上使用querySelectorAll会导致崩溃

我正在尝试通过PowerShell进行一些网络抓取,因为我最近发现它可以毫不费力地这样做.

一个很好的起点是只获取HTML,使用Get-Member,看看我能从那里做些什么,如下:

$html = Invoke-WebRequest "https://www.google.com"
$html.ParsedHtml | Get-Member
Run Code Online (Sandbox Code Playgroud)

我可用于获取特定元素的方法如下所示:

getElementById()
getElementsByName()
getElementsByTagName()
Run Code Online (Sandbox Code Playgroud)

例如,我可以在文档中获取第一个IMG标记,如下所示:

$html.ParsedHtml.getElementsByTagName("img")[0]
Run Code Online (Sandbox Code Playgroud)

然而,在对我是否可以使用CSS Selectors或XPath进行更多研究之后,我发现有未列出的方法可用,因为我们只是使用此处记录的HTML Document对象:

querySelector()
querySelectorAll()
Run Code Online (Sandbox Code Playgroud)

所以不要这样做:

$html.ParsedHtml.getElementsByTagName("img")[0]
Run Code Online (Sandbox Code Playgroud)

我可以:

$html.ParsedHtml.querySelector("img")
Run Code Online (Sandbox Code Playgroud)

所以我期待能够做到:

$html.ParsedHtml.querySelectorAll("img")
Run Code Online (Sandbox Code Playgroud)

...为了获得所有的IMG元素.我发现的所有文档和我已经完成的谷歌搜索都支持这一点.但是,在我的所有测试中,此函数都会使调用进程崩溃,并在事件日志(0xc0000374)中报告堆损坏异常代码.

我在Windows 10 x64上使用PowerShell 5.我在Win10 x64虚拟机中尝试过它,这是一个干净的构建,只是修补了.我也尝试过在Win7 x64上升级到PowerShell 5.我在PowerShell 5之前没有尝试过任何东西,因为我们这里的所有系统都已经升级了,但是我可能会有时间假设一个新的vanilla虚拟机进行测试.

有没有人以前遇到过这个问题?到目前为止,我所有的研究都是死路一条.querySelectorAll有替代品吗?我需要抓取在不可预测的布局中有可预测的标签集的页面,并且可能没有分配给标签的ID或类,所以我希望能够使用允许结构/嵌套/通配符的选择器.

PS我也试过在PowerShell中使用InternetExplorer.Application COM对象,结果是一样的,除了PowerShell崩溃Internet Explorer崩溃.这实际上是我原来的方法,这里是代码:

# create browser object
$ie = New-Object -ComObject InternetExplorer.Application

# make browser visible for debugging, otherwise this isn't necessary for function
$ie.Visible = $true

# browse to page
$ie.Navigate("https://www.google.com")
# wait till browser is not busy
Do { Start-Sleep …
Run Code Online (Sandbox Code Playgroud)

com powershell mshtml selectors-api powershell-5.0

6
推荐指数
1
解决办法
3553
查看次数

标签 统计

com ×1

mshtml ×1

powershell ×1

powershell-5.0 ×1

selectors-api ×1