2015-01-01 119 views
0

我相信我的大腦是由微小縮...保存網頁內容到變量

什麼我做的是檢索網頁,得到一些信息和電子郵件信息,都來自PowerShell的。電子郵件部分工作正常,但我在網頁處理部分有幾個問題。 我最初的想法是獲取頁面,將其下載到臨時文件,然後執行處理,然後刪除該文件。然後,我記得大約12年前在TCL中做類似的腳本,我的方法是將頁面內容傳遞給變量,然後調用變量以使用regexp處理數據。

$storageDir = "C:\Users\me\Documents" 
$browser=new-object system.net.webclient 
$browser.UseDefaultCredentials = $true 
$browser.downloadfile("http://whatever.com/cgi-bin/search_detail.cgi?num=01","$storageDir\Download1.HTML") 

以上會救我的處理文件,但就像我說的,我覺得是更好,更潔淨傳遞給一個變量,不知道怎麼做,在PowerShell中。

我在搜索以下3個標籤。所有這些領域將最終在& nbsp,我不需要在回報。 這些領域,我感興趣的字符串傳遞給一個變量字段的格式:

此字段爲字母數字

CAL_ID:</font><td>tt1234 &nbsp; 

此字段爲字母

CAL_FIRST:</font><td>TILAHUN &nbsp; 

這個字段將是一個電話號碼,格式可以改變,它應該如圖所示,但它可以輸入沒有任何電話分隔符或通常()爲區號,空格等。

CAL_NE:</font><td>123-456-7890 &nbsp; 

通常在TCL我會做這樣的事情在調用HTTP包後:

set posting [::http::geturl http://whateever.com/searchonly -query query] 
set raw_data [::http::data $posting] 

然後使用頁面的內容$ raw_data讓我的變量,像:

set data [regexp -all -inline -- {CAL_ID:</font><td>([^\>]*) &nbsp;} $raw_data] 

等我需要的其他領域。

我的頭只是不工作,越來越沮喪。任何幫助將不勝感激。

回答

0

需要開始稍微前進。所以你認爲下載html文件效率低下?在這種情況下,可能是因爲您首先要進行一些數據提取。爲什麼不使用$browser.DownloadString呢?

$html = $browser.DownloadString(....) 

好的,所以我們在變量$html中有我們的html,我們需要提取行中的數據。爲了測試的目的,這是我用於$html的內容。

This field will be alphanumeric 
CAL_ID:</font><td>tt1234 &nbsp; 
This field will be letters 
Thivll be letters 
s field wiCAL_FIRST:</font><td>TILAHUN &nbsp; 
This field will be a phone number and the format can vary, it should be as shown but it can be input without any phone separators or the usual() for the area code, spaces and such. 
s field wiCAL_NE:</font><td>123-456-7890 &nbsp; 

以下是提取數據的代碼。

$html | select-string -Pattern 'CAL_(ID|FIRST|NE).*?&nbsp;' -AllMatches | 
     ForEach-Object{$_.Matches} | 
     Select-Object -ExpandProperty Value | 
     ForEach-Object{ 
      $_ -replace [regex]::escape("</font><td>") -replace " &nbsp;" -replace ":","=" | ConvertFrom-StringData 
} 

樣本輸出

Name       Value                                   
----       -----                                   
CAL_ID       tt1234                                  
CAL_FIRST      TILAHUN                                  
CAL_NE       123-456-7890 

使用Select-String我們位於所有以 「CAL_」 及以下ID之一,FIRST或NE開始的數據。抓住一切,直到下一次出現「 」。然後我們採取數據這將是這個樣子(基於上述樣品。)

CAL_ID:</font><td>tt1234 &nbsp; 
CAL_FIRST:</font><td>TILAHUN &nbsp; 
CAL_ID:</font><td>tt1234 &nbsp; 
CAL_FIRST:</font><td>TILAHUN &nbsp; 
CAL_NE:</font><td>123-456-7890 &nbsp; 

修剪我們去除脂肪「」尾隨「 」,並轉換結腸一個等號。最後一個帶有等號的部分就是我們可以使用ConvertFrom-StringData,它以「key = value」的形式輸入字符串,這樣我們就可以輸出一個很好的對象。

自我批評

我選擇使用select-string,我想這可能是比較容易讓人接受,但我覺得使用PowerShell名爲捕獲一個簡單的正則表達式可能會更好。

__Update從Comments_

你提到在標題和評論的變量想要的數據。你忽略的部分是你想在變量。從技術上講,您只需將輸出保存爲變量,並將要查找的數據保存爲參數。所以上面的代碼會有這個第一行代替

$result = $html | select-string -Pattern 'CAL_(ID|FIRST|NE).*?&nbsp;' -AllMatches | 

然後,你可以像這樣訪問數據,因爲它是一個數組。

$result.CAL_NE 

注:這個工作最好的,如果你只有在數據一旦出現這些條目。最初我讓他們多次出現,以便能夠解釋這一點。

如果你真的想要New-Variable發揮作用的變量的結果。

$html | select-string -Pattern 'CAL_(ID|FIRST|NE).*?&nbsp;' -AllMatches | 
     ForEach-Object{$_.Matches} | 
     Select-Object -ExpandProperty Value | 
     ForEach-Object{ 
      $text = $_ -replace [regex]::escape("</font><td>") -replace " &nbsp;" 
      New-Variable -Name $text.split(":")[0] -Value $text.split(":")[1] 
} 

的,你可以訪問$CAL_ID

PS C:\users\Cameron\Downloads> $CAL_ID 
tt1234 
+0

感謝您的答覆。它當然有效,但我很難將該值賦值給一個變量。該變量可以設置爲名稱。我查看了convertfrom-stringdata,它確實有一個-OutVariable參數,但是現在我不確定這是否可以用於我想要的功能,請將每個值分配給一個變量。再一次感謝你的幫助。 – Nandy

+0

現在我在做: – Nandy

+0

現在我在做: $ test = $ _-替換「CAL_(ID | FIRST | NE)」 - 替換[regex] :: escape(「​​」) - 替換爲「  「-replace」:「 當然,測試會分配每個值,最終結果是我瞭解的最後一次交互的最後一個值。我可以使用$ i ++循環類型來更改名稱,但是我認爲它會更優雅,如果變量需要名稱本身,意味着 $ CAL_ID = tt1234 $ CAL_FIRST = TILAHUN $ CAL_NE = 123-456-7890 – Nandy