Извлечение таблицы из файла HTML с помощью PowerShell или VBS - PullRequest
2 голосов
/ 31 августа 2010

У меня проблема из двух частей, которую нужно исправить.Я изо всех сил постараюсь описать это, а затем разобрать, что я «думаю» по шагам.

Я пытаюсь получить определенную таблицу на веб-странице и отправить ее по электронной почте.

На данный момент я пытаюсь использовать GNU \ Win32 wget.exe (я бы предпочел использовать PowerShell изначально, но по какой-то причине я не смог, возможно, потому что метод, который я использовал, не мог отобразить страницу ASPX?)wget Мне удалось создать локальную HTML-версию страницы ASPX.

Теперь я пытаюсь проанализировать файл и извлечь конкретную таблицу.В данном конкретном случае таблица начинается с <table border="0" cellpadding="2" cellspacing="2" width="300px"> и заканчивается </table>, а вложенных таблиц нет.

Я бросил некоторое регулярное выражение в своей проблеме (да, я знаю, что регулярное выражение не может быть инструментом, который янужно здесь) но безрезультатно.

--- исправлено Вот где я сейчас ...

$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

Ответы [ 4 ]

5 голосов
/ 31 августа 2010

Я делал подобные вещи с 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 на свое регулярное выражение, например ::100100

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

В случае совпадения с несколькими таблицами вы должны переключиться с -match, который является логическим оператором, просто ищущим одно совпадение с Select-String, который может найти все совпадения, например ::11011*

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 голос
/ 04 сентября 2010

Некоторое время назад я написал функцию под названием 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
    }

Надеждаэто помогает

0 голосов
/ 04 сентября 2010

Я думал, что у командлетов HuddleMasses Get-Web есть возможность читать таблицы в виде XML.

0 голосов
/ 31 августа 2010

Я бы справился с этим с помощью 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)

  • поместить это в электронное письмо, отправить с помощью VBScript .Убедитесь, что у вас есть Mail.IsHTML = True.Вот еще один VBScript для отправки электронной почты вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...