从使用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

--------------解决方案-------------

我已经做了这样的事情使用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>

刚刚替补width ​​的border300px0您正则表达式,例如:

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

IH匹配多个表的情况下,你必须从-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}

前段时间我写了一个名为get-MarkupTag功能。 这可以让你远离不必直接使用正则表达式(它这样做在幕后)。 它还试图把HTML转换成XML,此时让出的数据是非常简单的。

要做到这一点用GET-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
}

希望这可以帮助

我想解决它使用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)
  • 它放入电子邮件,发送使用VBScript。 确保您有Mail.IsHTML = True 。 这里还有一个VBScript中发送电子邮件的问题。

我认为HuddleMasses获取,网络的cmdlet有一个选项来读取表中的XML。

分类:。净 时间:2015-03-15 人气:3
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.472 (s). 10 q(s)