Разбор локального HTML файла

Я могу использовать PowerShell для анализа HTML-страницы

PS > $foo = Invoke-WebRequest http://example.com

PS > $foo.Links.Count
1

Однако, если я загружаю страницу

PS > Invoke-WebRequest -OutFile example.htm http://example.com

а затем попытайтесь проанализировать загруженную страницу, она дает неожиданный результат

PS > $foo = Invoke-WebRequest file://$pwd/example.htm

PS > $foo.Links.Count
0

Как я могу разобрать локальную загруженную страницу?

Ответ 1

Вы можете использовать файл с веб-сервер чтобы обойти тупое ограничение Invoke-WebRequest

PS > $foo = Invoke-WebRequest http://localhost:8080/example.htm

PS > $foo.Links.Count
1

Обратите внимание, что это будет работать даже без соединения, например

PS > Invoke-WebRequest http://example.com
Invoke-WebRequest : The remote name could not be resolved: 'example.com'

Ответ 2

Похоже, что Invoke-WebRequest загружает URI-коды протокола t21 только в порядке, но не анализирует их даже в PowerShell 4.0 (там, где он официально поддерживается).

Альтернативой, которая не требует настройки веб-сайта, является загрузка и анализ HTML непосредственно в MSHTML.

$html = New-Object -ComObject "HTMLFile";
$source = Get-Content -Path "file.html" -Raw;
$html.IHTMLDocument2_write($source);

$html.links.length;

Обратите внимание, что когда я проверил это, один

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

заголовок предотвратил мой анализ HTML, и я понятия не имею, почему - у документа были похожие заголовки в стиле XHTML, и у MSHTML не было проблем с ними.

Ответ 3

Используйте формат ссылки на файл

$foo = Invoke-WebRequest "file://<path-to-file>"

Исправить мою ошибку

Если html является действительным xml, тогда вы можете использовать select-xml:

[xml]$html = Get-Content '<path_to_html_file>'
Select-Xml $html -XPath '//a' | foreach {$_.node}