Windows 10 64-бит. PowerShell 5.1
Разбор локального \ удаленного html с помощью регулярного выражения PowerShell 5.1.
Вывести все между тегами тела. Не включайте / включайте <body>
теги в результаты. Смотрите работу с локальным / удаленным файлом ниже. См. Найти что-нибудь между любым <tag>
и самым первым экземпляром </tag>
ниже.
Объясненные жадные и ленивые квантификаторы
regex101.com ваш друг.
Никогда не используйте (. ? | \ n) , всегда используйте (? s). *?
Скопируйте и вставьте в PowerShell 5.1
. Он выведет все между <body></body>
. Результаты выводятся дважды, один раз без тегов body и один раз с.
$testhtml = @'
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>AdminWeb</title>
<base href="/wwwroot/admin-web/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
<script src="/wwwroot/admin-web/runtime.js"></script><script src="/wwwroot/admin-web/file1.js" nomodule></script>
<script src="/wwwroot/admin-web/file2.js"></script><script src="/wwwroot/admin-web/styles.js"></script>
<script src="/wwwroot/admin-web/vendor.js"></script><script src="/wwwroot/admin-web/main.js"></script>
</body>
</html>
'@
$testhtml -match '(?s)(?<=<body>).*?(?=<\/body>)';$matches[0]
$testhtml -match '(?s)(<body>).*?(<\/body>)';$matches[0]
Команда может быть записана:
[regex]::matches($testhtml,'(?s)(?<=<body>).*?(?=<\/body>)').Value
[regex]::matches($testhtml,'(?s)(<body>).*?(<\/body>)').Value
Три разные команды для работы с локальным файлом. Вывод не включает теги тела:
(gc -Raw test.html) -match '(?s)(?<=<body>).*?(?=<\/body>)';$matches[0]
[Regex]::Matches((gc -Raw test.html), '(?s)(?<=<body>).*?(?=<\/body>)').Value
gc test.html -Raw | Select-String '(?s)(?<=<body>).*?(?=<\/body>)' -AllMatches | % { $_.Matches } | % { $_.Value }
Вывод результатов. html:
gc test.html -Raw | Select-String '(?s)(?<=<body>).*?(?=<\/body>)' -AllMatches | % { $_.Matches } | % { $_.Value } | sc results.html
Удаленный URL-адрес без и с тегом тела:
$testhtml = Invoke-WebRequest -Uri http://www.pgatour.com
$testhtml -match '(?s)(?<=<body>).*?(?=<\/body>)'
$matches[0]
$testhtml -match '(?s)(<body>).*?(<\/body>)'
$matches[0]
Удаленный URL-адрес без и с тегом тела. Вывод результатов. html:
$testhtml = Invoke-WebRequest -Uri http://www.pgatour.com
$testhtml -match '(?s)(?<=<body>).*?(?=<\/body>)'
$matches[0] | sc results.html
$testhtml -match '(?s)(<body>).*?(<\/body>)'
$matches[0] | sc results.html
Удаленный URL-адрес между любым тегом и первым экземпляром / tag
$testhtml = Invoke-WebRequest -Uri http://www.pgatour.com
$testhtml -match '(<div class="success-message">)(?s).*?(<\/div>)'
$matches[0]
Invoke-WebRequest -Uri http://www.pgatour.com | sc results.html
(gc -raw results.html) -match '(<div class="success-message">)(?s).*?(<\/div>)'
$matches[0]
Удаленный URL-адрес по имени класса. Они работают, но не очень продуктивно. См. Синтаксический анализ HTML Веб-страниц с Powershell
$response = Invoke-WebRequest -Uri http://www.pgatour.com
$response.ParsedHtml.body.getElementsByClassName('success-message')
$( $response.ParsedHtml.getElementsByTagName('div') | ?{$_.className -eq 'success-message'} ).outerHTML
$( $response.ParsedHtml.body.getElementsByTagName('div') | Where {$_.getAttributeNode('class').Value -eq 'success-message'} ).outerHTML