Синтаксический анализ HTML в PowerShell вернул search404Captions.content404Title

#html #powershell

#HTML #powershell

Вопрос:

Я планировал выполнить цикл для ряда веб-сайтов Windows KB, чтобы получить имена этих KB

Я использовал inspect и щелкнул по тексту, который я хотел, чтобы я мог видеть имена тегов / классов.

 $geturl = Invoke-WebRequest 'https://support.microsoft.com/en-us/help/4537759/security-update-for-adobe-flash-player'

$geturl.ParsedHtml.getElementsByTagName('h1')|?{$_.className -like 'c-heading'} | Select *html, *text
 

Я получил следующие результаты:

innerHTML: {{search404Captions.content404Title}}
outerHTML: {{search404Captions.content404Title}}
canHaveHTML: True
Внутренний текст: {{search404Captions.content404Title}}
Внешний текст: {{search404Captions.content404Title}}

Я искал его, чтобы вернуть «Обновление для системы безопасности для Adobe Flash Player: 11 февраля 2020 года» из этой статьи службы поддержки Microsoft.

Кто-нибудь может сказать мне, что я сделал не так? Я попытался погуглить, но не увидел ничего полезного

Комментарии:

1. Информация, которую вы ищете, не является частью HTML-документа, который динамически предварительно выбирается с помощью анонимной функции: microsoft.support.prefetchedArticle = (function() { return { 'en-us/4537759' : { "details": { "subType": "generic", "heading": "Security Update for Adobe Flash Player: February 11, 2020", ...

Ответ №1:

Исходный код HTML, который вы извлекаете, содержит заполнители для информации ( {{ ... }} ), которые будут заполнены позже с помощью JavaScript и библиотеки шаблонов, результаты которых вы увидите в интерактивном режиме в браузере.

(Определенные элементы, которые вы извлекаете, являются частью div для обработки ошибок ( <div ng-controller="404PageController"> ), поэтому они могут не иметь отношения к вам.)

Однако информация, используемая для создания экземпляра заполнителей, также является частью страницы внутри <script type="text/javascript"> элемента, который фактически содержит фрагмент JSON, определяющий все информационные элементы.

Поэтому вы можете:

  • извлеките этот JSON
  • проанализируйте его в графе объектов с помощью ConvertFrom-Json
  • и получить доступ к интересующим свойствам.

Предостережение:

Тот факт, что вам нужно знать потенциально специфичный для конкретной страницы шаблон поиска, чтобы извлечь JSON, и знать, что структура JSON делает этот подход хрупким, как обычно веб-очистка. Однако это может работать для похожих страниц на том же сайте, предполагая, что они были запрограммированы аналогично.

В конечном счете, единственный надежный способ получения информации с сайтов — это использование веб-служб, а не исходного кода HTML.

 # Get the target page's HTML source code:
# Note: Since we'll be doing *text parsing* below, we use Invoke-RestMethod
#       rather than Invoke-WebRequest for better performance.
$htmlSource = Invoke-RestMethod https://support.microsoft.com/en-us/help/4537759/security-update-for-adobe-flash-player

# Use the regex-based -replace operator to extract the JSON of interest.
$json = $htmlSource -replace '(?s). bmicrosoft.support.prefetchedArticles*=s*(function()s*{s*returns (. ?);;. ', '$1' -replace '}s*)s*(s*)s*'

# Parse the JSON into a [pscustomobject] object graph.
$dataProperties = $json | ConvertFrom-Json

# Extract the property containing the page title.
$dataProperties.'en-us/4537759'.details.title
 

Обратите en-us/4537759 внимание на свойство верхнего уровня, которое предполагает поведение, зависящее от языка. Возможно, вам придется использовать имя, соответствующее языку вашей системы.

Приведенное выше выводит строку Security Update for Adobe Flash Player: February 11, 2020 , как и предполагалось.