Попытка проанализировать содержимое веб-страницы и взаимодействовать с ним с помощью PowerShell.

Вот что я вставил в 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

person Ahmad Taj    schedule 30.07.2017    source источник
comment
Я должен добавить, что я использую PowerShell в терминале Mac.   -  person Ahmad Taj    schedule 30.07.2017


Ответы (2)


Я не верю, что вы можете сделать это (по крайней мере, пока) с PowerShell на платформах, отличных от Windows. Для анализа содержимого HTML PowerShell использует MSHTML.DLL и/или другие компоненты Internet Explorer/Edge, которых нет за пределами Windows. Обратите внимание, что GetElementById просто проксирует объект COM и в вашей среде нет объектов COM.

Вы можете проверить свойство RawContent объекта, возвращаемого Invoke-WebRequest, и самостоятельно проанализировать эту строку, чтобы найти нужное содержимое, но анализ HTML с помощью регулярных выражений не является стартовым, поэтому вам придется использовать другие методы.

Кстати, мне не удалось найти элемент с id из results_container на странице, которую вы используете в своем примере.

person alroc    schedule 30.07.2017

Что работает (но немного запутанно), так это использование AngleSharp в Powershell в качестве сборки .Net. Это также предлагается в ошибке Powershell github.

[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
person Diederik    schedule 19.07.2018