2010-08-31 122 views
2

我有兩部分需要修復的問題。我會盡我所能來形容它,然後打破我「認爲」的步驟。使用PowerShell或VBS從HTML文件中提取表格

我想在網頁中獲取特定的表格並將其發送給我自己。我想使用GNU \ Win32 wget.exe(我寧願使用PowerShell本身,但出於某種原因,我不能,也許是因爲我使用的方法無法呈現ASPX頁面? ) 使用wget我能夠製作ASPX頁面的本地html版本。

現在我一直在試圖解析文件並提取一個特定的表。在這種特殊情況下,表格以<table border="0" cellpadding="2" cellspacing="2" width="300px">開頭並以</table>結束,並且沒有嵌套表格。

我對我的問題拋出了一些正則表達式(是的,我知道正則表達式可能不是我需要的工具),但無濟於事。

--- Ammended 這是我在現在在哪裏?

$content = (new-object System.Net.WebClient).DownloadString($url) 
$found = $content -cmatch '(?si)<table border="0" cellpadding="2" cellspacing="2" width="300px"[^>]*>(.*?)Total Queries</td>(.*?)</tr>(.*?)</table>' 
$result = $matches[3] 
$result 
+0

這是一個一次性的任務,或者說要進行自動化的一段較長的時間?這是爲客戶還是爲管理員? – 2010-08-31 01:41:39

+0

自動化。管理員。 – 2010-08-31 18:42:12

回答

5

我已經用PowerShell完成了這種事情。這是很簡單的:

PS> $url = "http://www.windowsitpro.com/news/PaulThurrottsWinInfoNews.aspx" 
PS> $content = (new-object System.Net.WebClient).DownloadString($url) 
PS> $content -match '(?s)<table[^>]+border\s*=\s*"0"\s*.*?>(.*?)</table>' 
True 
PS> $matches[1] 

     <tr> 
      <snip> 
     </tr> 

只是代替0widthborder300px爲您正則表達式如:

PS> $content -match '(?s)<table[^>]+width\s*=\s*"300px"\s*.*?>(.*?)</table>' 

小時匹配多個表的情況下,你必須從-match,開關,是一個布爾運算符,只是希望找到一個匹配選擇字符串,它可以找到所有匹配,例如:

PS> $pattern = '(?s)<table[^>]+width\s*=\s*"300px"\s*.*?>(.*?)</table>'  
PS> $content | Select-String -AllMatches $pattern | 
       Foreach {$_.Matches | $_.Group[1].Value} 

基本上所有的匹配都將在$ _。Matches集合中。如果您知道該表始終是第三個你可以訪問像這樣:

... | Foreach {$_.Matches[2].Group[1].Value} 
+0

關閉。令人沮喪的關閉甚至。 :) 看起來像有兩個實例

但$匹配只顯示0和1這些都不是我是表試圖抓住。我究竟做錯了什麼? ARGHGHGHGGH!大聲笑! PS 這是你迄今爲止的幫助。 – 2010-08-31 18:49:11

+0

在這種情況下,您需要匹配表的所有實例。查看更新後的答案。 – 2010-08-31 20:28:13

+0

謝謝先生!得到它了。 :) – 2010-08-31 22:21:18

0

我會解決它使用VBScript這種方式。

  • 刪除所有的雙引號用單引號,只是爲了便於閱讀&編寫代碼。即myHTMLString = Replace(myHTMLString, """", "'")

  • 確定文件是否包含你的表。聽起來像它沒有idname屬性。太糟糕了,但如果失敗,請使用InStr來確定表的起始位置。 Dim tableStartsAt = InStr(myHTMLString,"<table border='0'")小心所有的屬性,因爲你擺在桌子的擺佈,它的屬性四處移動,你沒有注意到!也許當沒有找到匹配的表格時,發送電子郵件給你自己作爲警告,說明需要進行一些維護。

  • 現在您已經有了表格的起始位置,找到了它的結束標記。即Dim tableEndsAt = InStr(tableStartsAt,myHTMLString,"</table>")

  • 獲取HTML字符串:Dim myTable = Mid(myHTMLString,tableStartsAt,tableEndsAt-tableStartsAt)

  • 它放入一個email, send using VBScript。確保你有Mail.IsHTML = True。這是另一個VBScript sending email的問題。

0

我認爲HuddleMasses獲取的Web的cmdlet有一個選項表作爲XML閱讀。

1

前一段時間我寫了一個函數Get-MarkupTag。這使您不必直接使用正則表達式(它在封面下)。它也試圖將HTML轉換爲XML,此時獲取數據非常簡單。

若要獲取-MarkupTag做到這一點,你會做這樣的事情

$webClient = New-Object Net.Webclient -Property @{UseDefaultCredentials=$true} 
$html = $webClient.DownloadString($url) 
$table = Get-MarkupTag -html $html -tag "table" | 
    Where-Object { $_.Tag -like '<table border="0" cellpadding="2" cellspacing="2" width="300px">*' } | 
    Select-Object -expandProperty Xml 
$table.tr | # Row 
    Foreach-Object { 
     $_.Td # Column 
    } 

希望這有助於