1

这就是我放入 PowerShell 的内容:

PS > $source = "http://www.bing.com/search?q=sqrt(2)"
PS > $result = Invoke-WebRequest $source
PS > $resultContainer = $result.ParsedHtml.GetElementById("results_container")

这是我收到的错误消息:

The property 'ParsedHtml' cannot be found on this object. Verify that the property exists.                                                                                   At line:1 char:1                                                                                                                                                             + $resultContainer = $result.ParsedHtml.GetElementById("results_contain ...                                                                                                  
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict
4

2 回答 2

4

我不相信你可以在非 Windows 平台上使用 PowerShell 做到这一点(至少现在还不能)。为了解析 HTML 内容,PowerShell 使用 MSHTML.DLL 和/或 Windows 之外不存在的其他 Internet Explorer/Edge 组件。请注意,GetElementById只是 COM 对象的代理,您的环境中没有 COM 对象。

您可以检查由RawContent返回的对象的属性Invoke-WebRequest并自己解析该字符串以查找所需的内容,但是使用正则表达式解析 HTML 是行不通的,因此您必须使用其他方法。

顺便说一句,我无法在您在示例中使用的页面上找到带有idof的元素。results_container

于 2017-07-30T07:17:35.060 回答
2

有效(但有点混乱)是在 Powershell 中使用AngleSharp作为 .Net 程序集。Powershell github issue中也建议使用它。

[string]$html = "<!DOCTYPE html>
<html lang=en>
    <meta charset=utf-8>
    <meta name=viewport content=""initial-scale=1, minimum-scale=1, width=device-width"">
    <title>Error 404 (Not Found)!!1</title>
    <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
    <p><b>404.</b> <ins>That’s an error.</ins>
    <p>The requested URL <code>/error</code> was not found on this server.  <ins>That’s all we know.</ins>";

#Loads assembly for angle sharp: https://stackoverflow.com/questions/39257572/loading-assemblies-from-nuget-packages 
#WARNING: probably in a non-portable way.
$standardAssemblyFullPath = (Get-ChildItem -Filter *.dll -Recurse (Split-Path (get-package AngleSharp).Source)).FullName | Where-Object {$_ -like "*standard*"}
Add-Type -Path $standardAssemblyFullPath

$parser = New-Object AngleSharp.Parser.Html.HtmlParser
$document = $parser.Parse($html);

$elements = $document.All | Where-Object {$_.id -eq "logo"};

Write-Host $elements.OuterHtml
于 2018-07-19T21:06:48.367 回答