我有一个需要修复的两部分问题。我会尽力描述它,然后分解我“想”的步骤。
我正在尝试在网页中获取特定的表格并通过电子邮件发送给自己。
目前我正在尝试的是使用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 :(得分: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>
只需将width
替换为border
,将300px
替换为0
代表您的正则表达式:
PS> $content -match '(?s)<table[^>]+width\s*=\s*"300px"\s*.*?>(.*?)</table>'
在匹配多个表的情况下,你必须从-match切换,这是一个布尔运算符,只是想找到一个匹配的Select-String,它可以找到所有的匹配,例如:
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}
答案 1 :(得分:1)
前段时间我写了一个名为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
}
希望这有帮助
答案 2 :(得分:0)
我会用VBScript以这种方式处理它。
用单引号删除所有双引号,只是为了便于阅读和阅读编写代码。即myHTMLString = Replace(myHTMLString, """", "'")
确定文件是否包含您的表格。听起来它没有id
或name
属性。太糟糕了,但如果不这样做,请使用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问题。
答案 3 :(得分:0)
我认为HuddleMasses Get-Web cmdlet可以选择将表读入XML。