2017-05-02 22 views
2

テキストファイルからURLを抽出しようとしています。私はこれを行うためにPowerShellを使用しています。 URLの最後の部分は毎回異なります。次のようにファイルの抜粋です:t=後の文字列が毎回異なるものになりますテキストファイルからURLを抽出し、Powershellを使用して解析します。

https://www.website.com:443/idb/setPassword 

<table class="button" style="border-collapse: collapse; border-spacing: 0; overflow: 
hidden; padding: 0; text-align: left; vertical-align: top; width: 100%;"><tbody> 
<tr style="padding: 0; text-align: left; vertical-align: top;"><td style="-moz-hyphens: none; 
-webkit-hyphens: none; -webkit-text-size-adjust: none; background: #049FD9; 
border: none; border-collapse: collapse !important; border-radius: 2px; color: #fff; display: block; font-family: 'Helvetica-Light','Arial',sans-serif; font-size: 14px; font-weight: lighter; hyphens: none; line-height:19px; margin: 0; padding: 8px 16px; text-align: center; vertical-align: top; width: auto 
!important; word-break: keep-all;"> 
<a href="https://www.website.com:443/idb/setPassword?t=BcHJEoIgAADQD%2BKQjqZ4VEKtBHLJJm82uWDuxCR%2Bfe%2B58Rl9HRz6QddWkO5MLDXuF6e9m%2Bo0z%2FCVS%2B9IenAp5m5yTfYRa%2BAn4jdWHHF7HTyqRZiRRiNDEE%2BK7ZJywLKeNCTj4ewu4QNu02qXB0ZTXTyxXADwaLeluZGVPCxGXunpVcHbiCVAWRR7ykqGensLVBsqNUpl%2FQE%3D" 
style="-webkit-text-size-adjust: none; font-weight: 100; color: #fff; font-family: 'Helvetica-Light','Arial',sans-serif; font-size: 20px; font-weight: lighter; line-height: 32px; text-decoration: none;">Get Started</a> </td></tr></tbody></table></td> 

は私がで始まるURLを抽出したいです。どのようにしてURL全体を抽出して、必要な情報を得るために解析できる変数にすることができますか??t=の後の文字列ですか?

答えて

0

は、以下のことを試してみてください。$content

$content = Get-Content -Path 'C:\test.txt' 
[regex]$regex = '(?<=href="https:\/\/www\.website\.com:443\/idb\/setPassword\?t=)(.*)(?=")' 
$regex.Matches($content).Value 

URLが含まれており、サイトへの正しいURLで$regexを更新テキストファイルとパスを交換してください。

この方法では、(?<=)の前にウェブサイトのURLと(?=)の後に一致するようにRegexを使用し、次に中間のテキストを選択します。ここ

+0

これはいつも起こっているようですが、私がこれを投稿した後、私は、愚かな出力がテキストdocuemntとURLをスペースで囲んで書式を設定していたので、決して一致しませんでした。そこで、-Width 999999コマンドを使用して、URLが1行にあることを確認しました。あなたが投稿したときに、私はこの行を引き出し、必要な文字列に一致させるために、この類似の正規表現を使用することになりました。ご回答有難うございます。 –

2

Select-Stringと正規表現を組み合わせてURLを取得し、[system.uri]クラスを使用してそれを調べるソリューションです。

$Text = get-content 'html-sample.txt' 
$URLString = ((Select-String '(http[s]?)(:\/\/)([^\s,]+)(?=")' -Input $Text).Matches.Value) 

#At this point $URL is a string with just the URL and querystring as requested 
$URLString 

#Heres how you might interrogate it 
[system.uri]$URL = $URLString 
$Token = ($URL.Query -split '=')[1] 
$URL.host 
$Token 

説明:

  • は、URLを抽出するためにSelect-Stringで正規表現(http[s]?)(:\/\/)([^\s,]+)(?=")を使用します。これはデフォルトで初めて一致するだけですので、-AllMatchesスイッチをSelect-Stringにして、複数のURLを照合する必要がある場合は、それぞれの結果をForEachループで処理する必要があります。
  • [system.uri]を使用してURLをURIオブジェクトとしてキャストします。
  • オブジェクトのhostプロパティにアクセスして、ベースURLを返します。
  • オブジェクトのqueryプロパティにアクセスしてクエリ文字列を返し、文字列の先頭に表示される置き換え([^トークン])のみを行う正規表現を使用して '?t ='部分を置き換えます。バックスラッシュで他の正規表現の特殊文字をエスケープします。
+0

私は上記のマッチパラメータを使用して終了しましたが、それを試してみました。ありがとう! –

+0

URLの末尾に二重引用符をつかんでいることに気づいたので、ちょっとしたバグを修正したところ、トークンの最後に%22のようにエンコードされていました。二重引用符を取り除くための-replaceが追加されました。 –

0

は常にXmlDocumentとして、ファイルを読み取るために、[XML]キャストすることにより、別の方法は、[その後、キャスト

$thisxml = [xml](gc .\hypertext.html) 

、その後のXPath

$thisxpath = ($thisxml).SelectNodes("//table//tr//td//a").href 

を使用したいノードにドリルダウン....ですsystem.uri]を使って必要なURIを解析して選択します。

$thisuri = [System.Uri]$thisxpath | %{($_.Scheme + "://" + $_.host + $_.LocalPath)} 
関連する問題