我正在尝试通过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)