Powershell - Как выделять текст на стороне <H1>, но не <SPAN>. Ошибка двоеточия - PullRequest
0 голосов
/ 03 марта 2020

Я немного перебираю паутину с помощью Powershell. На сайте был элемент с кодом, подобным следующему:

<h1 class="">1001 Nights&nbsp;<span id="titleYear">(<a href="/year/1968/?ref_=tt_ov_inf">1968</a>)</span>            </h1>

И я хочу извлечь текст внутри, этот текст:

1001 Nights

, но не этот текст:

<span id="titleYear">(<a href="/year/1968/?ref_=tt_ov_inf">1968</a>)</span>

А селектор CSS на сайте выглядит примерно так:

 "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1"

Выполняя поиск по переполнению стека, я нашел код задания, как показано ниже.

$Result =  Invoke-WebRequest -Uri "https://www.imdb.com/title/tt0062940/?ref_=ttls_li_tt"
$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1"
$NodeList = $Result.ParsedHtml.querySelectorAll( $movieTitleSelector)
$PsNodeList = @()
for ($i = 0; $i -lt $NodeList.Length; $i++) { 
   $PsNodeList += $NodeList.item($i)
}
$PsNodeList | ForEach-Object {
   $_.InnerText
}

И результат:

1001 Nights (1968)

"1001 Nights" - это заголовок mov ie, а "1968" - год выпуска, который был включен в <span></span>. Я просто хочу заглавную часть, а не год выпуска. Я обнаружил некоторый код в переполнении стека, в котором говорится, что я могу выбирать только текст в теге <h1>, а не внутри <span>, изменив код в тексте выше на:

$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1 :not(span)"

Но при запуске код, он выдает ошибку

Invalid argument.
At line:1 char:1
+ $NodeList = $Result.ParsedHtml.querySelectorAll( "#title-overview-wi ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException

. Я думаю, что ошибка произошла, потому что в строке $ movieTitleSelector было двоеточие, но я не очень уверен. Кто-нибудь, пожалуйста, скажите мне, как я могу получить текст заголовка в элементе <h1>, но не внутри тега <span>. Спасибо.

1 Ответ

0 голосов
/ 03 марта 2020

Почему бы и нет, просто удалите год или любую нужную вам строку с помощью регулярного выражения в экстракте.

$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1 :not(span)" -replace '\s\(\d{4}\)'

'1001 Nights (1968)' -replace '\s\(\d{4}\)'
<#
# Results

1001 Nights
#>

Обновление

Попробуйте это ... основываясь на вашем ответе.

$Result =  Invoke-WebRequest -Uri "https://www.imdb.com/title/tt0062940/?ref_=ttls_li_tt"
$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1"
$NodeList = $Result.ParsedHtml.querySelectorAll( $movieTitleSelector)

$PsNodeList = @()

for ($i = 0; $i -lt $NodeList.Length; $i++) { 
   $PsNodeList += $NodeList.item($i)
}
$PsNodeList | 
ForEach-Object {
   $_.InnerText -replace '\s\(\d{4}\)' 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...