Разбор локального 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}