15

Web サイトから「newstitle」という名前のすべてのクラス内のテキストを取得する PowerShell スクリプトを作成しようとしています。

これは私が持っているものです:

function check-krpano {
    $geturl=Invoke-WebRequest http://krpano.com/news/
    $news=$geturl.parsedhtml.body.GetElementsByClassName("newstitle")[0]
    Write-Host  "$news"
}

check-krpano

明らかにもっと微調整が必​​要ですが、今のところうまくいきません。

GetElementById を使ってスクリプトを書くことはできたのですが、GetElementsByClassName の構文がわからず、正直あまり情報を見つけることができませんでした。

ノート:

質問に対する正しい答えにチェックを入れましたが、それはスクリプトで使用することを選択した解決策ではありません。

2 つの方法を使用して、特定のクラスを含むタグ内のコンテンツを見つけることができましたが、リンクの検索よりもはるかに時間がかかりました。

Measure-Command を使用した出力は次のとおりです。

  • parsedhtml.body を使用してクラス「newstitle」を含む div を検索 -> 29.6 秒
  • Allelements を使用してクラス「newstitle」を含む開発者を検索 -> 10.4 秒
  • 要素「href」に #news が含まれるリンクを検索 -> 2.4 秒

そのため、Links メソッドの回答が有用であるとマークしました。

これは私の最終的なスクリプトです:

function check-krpano {
    Clear-Host
    $geturl=Invoke-WebRequest http://krpano.com/news
    $news = ($geturl.Links |Where href -match '\#news\d+' | where class -NotMatch 'moreinfo+' )
    $news.outertext | Select-Object -First 5
}

check-krpano
4

5 に答える 5

19

getElementsByClassName配列を直接返すのではなく、COM 経由で結果へのプロキシを返します。あなたが発見したように、配列への変換は[]演算子では自動ではありません。リスト評価構文 を使用して@()、最初に配列に強制し、個々の要素にアクセスできるようにすることができます。

@($body.getElementsByClassName("foo"))[0].innerText

余談ですが、オブジェクト パイプラインを使用すると、変換は自動的に実行されます。

$body.getElementsByClassName("foo") | Select-Object -First 1

foreachまた、次の構文でも自動的に実行されます。

foreach ($element in $body.getElementsByClassName("foo"))
{
    $element.innerText
}
于 2014-03-01T15:08:54.253 に答える
1

これは古い質問だと思いますが、次のようなCOMオブジェクトを使用してInternet Explorerを制御することで同じことを達成しようとしている可能性のある他の人に答えを追加したかったのです。

$ie = New-Object -com internetexplorer.application
$ie.navigate($url)
while ($ie.Busy -eq $true) { Start-Sleep -Milliseconds 100; }

私は通常、元の投稿者が行ったように Invoke-WebRequest を使用することを好みますが、parsedhtml を期待していても、JavaScript によって生成されたすべての DOM 要素を表示するには、本格的な IE インスタンスが必要なように思われるケースを見つけました。 .body に含めます。

クラス名で要素のコレクションを取得するには、次のようなことができることがわかりました。

$titles = $ie.Document.body.getElementsByClassName('newstitle')
foreach ($storyTitle in $titles) {
     Write-Output $storyTitle.innerText
}

PowerShell を使用して DOM を検索すると、元の投稿者が指摘したのと同じ非常に遅いパフォーマンスが見られましたが、PowerShell 3.0 と IE11 を使用すると、Measure-Command は、私のクラスのコレクションが 125 KB の HTML ドキュメントで 280 ミリ秒で見つかることを示しています。

于 2017-08-03T01:12:14.973 に答える