我在访问调用的网页 HtmlWebResponseObject 对象时遇到问题。该对象由以下人员获取:
PS>$webpage = Invoke-WebRequest -uri "https://www.grittv.com/tv-schedule/"
尝试解析/查询后:
PS>$webpage.AllElements
它只是停留在那里,光标闪烁,直到我取消它(一次 30 分钟以上)
以下是一些调查:
PS>$webpage | get-member
TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject
Name MemberType Definition
---- ---------- ----------
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
AllElements Property Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
BaseResponse Property System.Net.WebResponse BaseResponse {get;set;}
Content Property string Content {get;}
Forms Property Microsoft.PowerShell.Commands.FormObjectCollection Form...
Headers Property System.Collections.Generic.Dictionary[string,string] He...
Images Property Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
InputFields Property Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
Links Property Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
ParsedHtml Property mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent Property string RawContent {get;set;}
RawContentLength Property long RawContentLength {get;}
RawContentStream Property System.IO.MemoryStream RawContentStream {get;}
Scripts Property Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
StatusCode Property int StatusCode {get;}
StatusDescription Property string StatusDescription {get;}
PS>$webpage.RawContentLength
139792
PS>$webpage.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False HtmlWebResponseObject Microsoft.PowerShell.Commands.WebResponseObject
状态代码返回200
和OK
是什么阻碍了解析?您能帮忙调用此数据吗:?
$list = $webpage.allelements | where class -EQ "three-quarters"| select -ExpandProperty innertext
此外,它做过我相信它只工作了一次。我关闭了脚本,改天再回来,但从那以后,它似乎就挂了。
在第二台计算机上调用得到了相同的结果。
谢谢
答案1
请记住,Invoke-WebRequest 使用的是旧的、有缺陷的 IE 引擎,因此奇怪的事情是可以预料的。
首先要说明的是,您使用的是 Invoke-WebRequest,默认情况下,它会呈现 HTML DOM 并完全混淆 AllElements 成员。在使用 JavaScript 的页面上,这可能会发生其他事情,例如打开 IE 窗口或隐藏提示无休止地等待您的响应。
您需要向 Invoke-WebRequest 添加 参数
-UseBasicParsing
,如下所示:
$webpage = Invoke-WebRequest -uri "https://www.grittv.com/tv-schedule/" -UseBasicParsing
使用时的缺点-UseBasicParsing
是您没有可以
.ParsedHtml
使用的 DOM 函数。
结果$webpage
不能与 一起使用AllElements
。您需要直接访问其属性。
列出所有属性及其值:
$webpage | Format-List
例如查看所有链接:
$webpage | select -ExpandProperty Links