Почему мой скрипт PowerShell не работает должным образом - PullRequest
0 голосов
/ 03 марта 2020

Я создал скрипт для сканирования сайта IMDB. Мой сценарий берет список URL IMDB, запускает и извлекает данные, такие как mov ie title, год выпуска, сводный график и экспортирует их в текстовый файл в CSV. Я написал сценарий, как показано ниже.

$listToCrawl =  "imdb_link_list.txt"
$pathOfFile = "K:\MY DOCUMENTS\POWERSHELL\IMDB FILE\"
$fileName = "plot_summary.txt"
New-Item ($pathOfFile + $fileName) -ItemType File
Set-Content ($pathOfFile + $fileName) '"Title","Year","URL","Plot Summary"'

Get-Content ($pathOfFile + $listToCrawl) | ForEach-Object {
 $url = $_
$Result =  Invoke-WebRequest -Uri $url

$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1"
$movieTitleNode = $Result.ParsedHtml.querySelector( $movieTitleSelector)
$movieTitle = $movieTitleNode.innerText

$movieYearSelector = "#titleYear"
$movieYearNode = $Result.ParsedHtml.querySelector($movieYearSelector)
$movieYear = $movieYearNode.innerText

$plotSummarySelector = "#titleStoryLine > div:nth-child(3) > p > span"
$plotSummaryNode = $Result.ParsedHtml.querySelector($plotSummarySelector)
$plotSummary = $plotSummary.innerText
$movieDataEntry = '"' + $movieTitle + '","' + $movieYear + '","' + $url + '","' + $plotSummary + '"'
Add-Content ($pathOfFile + $fileName) $movieDataEntry
}

Список URL-адресов для извлечения сохранен в файле "K: \ MY DOCUMENTS \ POWERSHELL \ IMDB FILE \ imdb_link_list.txt", а его содержимое показано ниже .

https://www.imdb.com/title/tt0472033/
https://www.imdb.com/title/tt0478087/
https://www.imdb.com/title/tt0285331/
https://www.imdb.com/title/tt0453562/
https://www.imdb.com/title/tt0120577/
https://www.imdb.com/title/tt0416449/

Я просто импортирую и запускаю скрипт. Это не работает, как ожидалось. Ошибка сгенерирована.

Invalid argument.
At K:\MY DOCUMENTS\POWERSHELL\IMDB_Plot_Summar_ Extract.ps1:20 char:1
+ $plotSummaryNode = $Result.ParsedHtml.querySelector($plotSummarySelec ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException

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

$plotSummarySelector = "#titleStoryLine > div:nth-child(3) > p > span"

Кто-нибудь знает, что с этим не так?

1 Ответ

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

Свойство ParsedHtml задается c для PowerShell для Windows, а не существует в PowerShell Core , поэтому, если вы хотите сохранить свой код в будущем, лучше использовать что-то вроде HTML Agility Pack .

# install the HTML Agility Pack nuget package
Invoke-WebRequest -Uri "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -OutFile ".\nuget.exe"; 
.\nuget.exe install "HtmlAgilityPack" -Version "1.11.21";

# import the HTML Agility Pack
Add-Type -Path ".\HtmlAgilityPack.1.11.21\lib\Net40\HtmlAgilityPack.dll";

# get the web page content and load it into a HtmlDocument
$response = Invoke-WebRequest -Uri "https://www.imdb.com/title/tt0472033/" -UseBasicParsing;
$html = $response.Content;
$doc = new-object HtmlAgilityPack.HtmlDocument;
$doc.LoadHtml($html);

, тогда вы можете извлечь узлы, используя синтаксис XPath - например, для заголовка:

# extract the title
$titleHtml = $doc.DocumentNode.SelectSingleNode("//div[@class='title_wrapper']/h1/text()[1]").InnerText;
$titleText = [System.Net.WebUtility]::HtmlDecode($titleHtml).Trim();
write-host "'$titleText'"; # '9'

Я буду оставьте остальные элементы документа в качестве упражнения для читателя: -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...