0

そのため、私 (および私のグループ) に毎日電子メールで送信されるサードパーティから生成された HTML ファイルがあります。ID 番号、名前、および該当する場合は複数の電子メール アドレスの表が含まれています。AD でグループ メンバーシップを更新するために使用されます。グループ メンバーシップの更新部分は簡単なので、powershell でこれを実行できるようにしたいと考えています。AD のユーザー名でもある電子メール アドレスを取得するための HTML ファイルの解析は、難しい部分です。私はちょっと困っています。HTMLAgilityParser を使用してみましたが、私の目的にはそれほどうまく機能していないようです。使いやすさのために何らかの方法でデータを .CSV に入れることができれば、それは素晴らしいことです。

必要なのは、A) HTML から電子メール アドレスを直接取得して CSV ファイルに配置するか、B) HTML ファイルを .CSV に変換して解析することです。

その理由は、このデータが毎日入ってくるため、自動化する必要があるからです。

ありがとう!

html ファイルのサンプル。すべての識別情報が削除または調整されています。

<table>
<tr>
<td class=xl27>
<span class=font7>ID</span>
</td>
<td class=xl27>
<span class=font7>Name</span>
</td>
<td class=xl27>
<span class=font7>Primary E-Mail</span>
</td>
<td class=xl27>
<span class=font7>Alternate E-Mail</span>
</td>
</tr>
<tr>
<td class=xl28>
<span class=font8>00000000</span>
</td>
<td class=xl28>
<span class=font8>Smith,John R</span>
</td>
<td class=xl28>
<span class=font8></span>
</td>
<td class=xl28>
<span class=font8>John_Smith@addr</span>
</td>
</tr>
4

2 に答える 2

0

これが解決策の始まりです。あまり良くありません... ディレクトリ スクリプト ファイルの Html-Agility-Pack ディレクトリに HtmlAgilityPack.dll があるとします。

Add-Type -Path "$(Split-Path -parent $PSCommandPath)\Html-Agility-Pack\HtmlAgilityPack.dll"


$webGraber = New-Object -TypeName HtmlAgilityPack.HtmlWeb
$webDoc = $webGraber.Load("C:\temp\t.htm")
$trDatas = $webDoc.DocumentNode.ChildNodes.Elements("tr")

Remove-Item "c:\temp\t.csv"

foreach ($trData in $trDatas)
{
  $tdDatas = $trData.elements("td")
  $line = ""
  foreach ($tdData in $tdDatas)
  {
    $line = $line + $tdData.InnerText.Trim() + ','
  }
  $line.Remove($line.Length -1) | Out-File -FilePath "c:\temp\t.csv" -Append
}
于 2013-08-28T07:22:56.560 に答える
0

このケースに非常に固有であるため、この回答を投稿することをためらっていますが、これは単純な文字列メソッドで実現できます。まず、html ファイルの内容を取得します。

$htmlContent = Get-Content -Path 'thePath\andFile.html'

次に、探している値を含む html データから文字列を選択します。この部分は、HTML の構造に完全に固有のものです。

$stringsWithDesiredValues = $htmlContent.Where({$_ -like '*<span class=font8>*'})

これで、foreach を使用し、'>' と '<' のインデックスを使用して、目的の値のみを含む部分文字列を取得できます。

foreach($htmlString in $stringsWithDesiredValues){
$firstIndex = $htmlString.IndexOf('>') + 1
$lastIndex = $htmlString.LastIndexOf('<')
$lengthOfSubstring = $lastIndex - $firstIndex
$desiredValue = $htmlString.Substring($firstIndex,$lengthOfSubstring)
$desiredValue}

もちろん、ここでは目的の値で何もしていませんが、このスクリプトは値を書き出すので、値が正しいことを確認できます。明らかに、これらの値をループでキャプチャして、必要なことを行うことができます。確かに醜い解決策ですが、他の回答が示唆されていないため、投稿しただけです。

于 2015-07-30T20:49:09.697 に答える