none
Преобразование htm (html) в csv с сохранением определённого поля с параметром RRS feed

  • Вопрос

  • начало здесь:

    https://social.technet.microsoft.com/Forums/ru-RU/2ae47ca4-6af0-49d4-9014-9940209028d2/-htm-html-csv?forum=windows7ru

    спасибо товарищу Kazun за оперативную и вкалифицированную помощь.

    как оказалось при импорте программа видит только первую строку csv файла (по неведомым причинам) отсюда возникла необходимость оставить из html

    <HTML><HEAD><meta http-equiv="refresh" content="150";><TITLE>Current Conditions at  ,  </TITLE></HEAD><BODY background="Clouds.jpg"><P><FONT size=4></FONT></P><P><TABLE border=0 cellSpacing=0 cellPadding=0 width="90%" align=center  height=50 > </TABLE></P><P align=center><FONT size=5  color=darkred><STRONG><A NAME = "Current">Current Weather Conditions at  ,  </A></STRONG></FONT></P><P align=center><FONT size=4  color=darkred><STRONG><A NAME = "Current">As of:  10.06.16 16:41</A></STRONG></FONT></P><TABLE  cellspacing=1 cellpadding=0 width="85%"  align=center  border=1>    <TR height=20>   <TD Width="33%"><STRONG><FONT face="Tw Cen MT">Temperature:</FONT></STRONG></TD>    <TD Width="22%" align=left> <b> 22.8°C</b></TD>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Dewpoint:</FONT></STRONG></TD>  <TD Width=100 align=left><b>5.7°C</b></TD>  </TR>   <TR height=20>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Humidity:</FONT></STRONG></TD>    <TD Width=100 align=left><b> 33% </b></TD>    <TD Width="33%"><STRONG><FONT face="Tw Cen MT">Wind Chill:</FONT></STRONG></TD>  <TD Width="11%" align=left><b>22.8°C</b></TD>  </TR>   <TR height=20>   <TD Width="15%"><STRONG><FONT face="Tw Cen MT">Wind:</FONT></STRONG> </TD>    <TD Width="18%" align=left><b> SSW at 1.8&nbsp;m/s</b></TD>    <TD Width=200><STRONG><FONT face="Tw Cen MT">THW Index:</FONT></STRONG></TD>  <TD Width=100 align=left><b>21.8°C</b></TD>  </TR>  <TR height=20>   <TD Width=200><STRONG><FONT face="Tw Cen MT">Barometer:</STRONG></FONT></TD>    <TD Width=100 align=left> <b> 754.2&nbsp;mm and Falling Slowly</b></TD>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Heat Index:</FONT></STRONG></TD>  <TD Width=100 align=left><b> 21.8°C</b></TD>  </TR>  <TR height=20>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Today's Rain:</FONT></STRONG></TD>  <TD Width=100 align=left> <b>0.0&nbsp;mm</b></TD>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Monthly Rain:</FONT></STRONG></TD>    <TD Width=100 align=left><b>13.5&nbsp;mm</b></TD>  </TR>  <TR height=20>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Storm Total:</FONT></STRONG></TD>    <TD Width=100 align=left><b>0.0&nbsp;mm</b></TD>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Yearly Rain:</FONT></STRONG></TD>    <TD Width=100 align=left><b>101.3&nbsp;mm</b></TD>  </TR>  <TR height=20>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Current Rain Rate:</FONT></STRONG></TD>  <TD Width=100 align=left> <b>0.0&nbsp;mm/hr</b></TD>    <TD Width=200><STRONG><FONT face="Tw Cen MT">Solar Radiation:</FONT></STRONG></TD>    <TD Width=100 align=left><b>517&nbsp;W/m?</b></TD>  </TR>  <TR height=20>    <TD Width=200><STRONG><FONT face="Tw Cen MT">UV:</FONT></STRONG></TD>    <TD Width=100 align=left><b>---&nbsp;index</b></TD>  </TR> </TABLE><br><P align=center><FONT size=4  color=darkred><STRONG><A NAME = "Current">Sunrise:   4:41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sunset:  20:37</A></STRONG></FONT></P>  <TABLE align=center>  <TR width="100%"><TD>  <font size = 4 face="verdana,arial" color=darkred><STRONG>This Site Powered by:</STRONG></font></TD></TR><TR align=center><TD><a href="http://www.davisnet.com" target=HI><img src="Davis Logo.jpg"></a></TD></TR></TABLE></P><TABLE  cellspacing=1 cellpadding=0 width="85%"  align=center  border=1>    </BODY></HTML>

    только одну строку в csv

    "Solar Radiation:","517 W/m?"

    При попытке запустить:

    $TableNumber = 1
    $result = @()
    
    
    
    $wb = (Get-Content D:\Temp\27\Weather_Summary_Vantage_Pro_Plus.htm -Raw) -replace "&nbsp;"," " -match "(Solar Radiation:).+<b>(.+)\B</b></TD>" | % {"{0} {1}" -f $matches[1],$matches[2]}
    $WebRequest  = New-Object -ComObject "HTMLFile"
    $WebRequest.IHTMLDocument2_write($wb) 
    
    
    
    ## Extract the tables out of the web request
    
    $tables = @($WebRequest.getElementsByTagName("TABLE"))
    
    $table = $tables[$TableNumber]
    
    $titles = @()
    
    $rows = @($table.Rows)
    
    ## Go through all of the rows in the table
    
    foreach($row in $rows)
    {
    
        $cells = @($row.Cells)
    
        
    
        ## If we’ve found a table header, remember its titles
    
        if($cells[0].tagName -eq "TH")
    
        {
    
            $titles = @($cells | % { ("" + $_.InnerText).Trim() })
    
            continue
    
        }
    
        ## If we haven’t found any table headers, make up names "P1", "P2", etc.
    
        if(-not $titles)
    
        {
    
            $titles = @(1..($cells.Count + 2) | % { "P$_" })
    
        }
    
        ## Now go through the cells in the the row. For each, try to find the
    
        ## title that represents that column and create a hashtable mapping those
    
        ## titles to content
    
        $resultObject = [Ordered] @{}
    
        for($counter = 0; $counter -lt $cells.Count; $counter++)
    
        {
    
            $title = $titles[$counter]
    
            if(-not $title) { continue }
    
            
    
            $resultObject[$title] = ("" + $cells[$counter].InnerText).Trim()
    
        }
    
        ## And finally cast that hashtable to a PSCustomObject
    
       $result += [PSCustomObject] $resultObject
    
    } 
    
    
    $result | ConvertTo-Csv -NoTypeInformation | Select -Skip 1 | Out-File D:\Temp\27\Weather_Summary_Vantage_Pro_Plus.htm.csv

    выдаёт ошибку:

    Не удается индексировать в массив NULL.
    D:\Temp\27\Weather_CSV.ps1:6 знак:149
    + ... /b></TD>" | % {"{0} {1}" -f $matches[1],$matches[2]}
    +                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray

    спасибо за помощь.

    21 июня 2016 г. 14:49

Ответы

  • Никаких проблем:

    (gc .\Weather_Summary_Vantage_Pro_Plus.htm -Raw) -replace "&nbsp;"," " -match "(?s)(Solar Radiation:).+<b>(.+)\B</b></TD>" | % {'"{0}","{1}"' -f $matches[1],$matches[2]}
    "Solar Radiation:","517 W/m?"

    Для сохранения в файл , в конец добавить:

    | Out-File result.csv


    • Изменено Kazun 22 июня 2016 г. 6:30
    • Предложено в качестве ответа Kazun 22 июня 2016 г. 7:37
    • Помечено в качестве ответа Morn1ng 22 июня 2016 г. 7:57
    22 июня 2016 г. 6:27
  • спасибо, ЧЕЛОВЕЧИЩЕ, помог. всё работает )

    (gc .\Weather_Summary_Vantage_Pro_Plus.htm -Raw) -replace "&nbsp;"," " -match "(?s)(Solar Radiation:).+<b>(.+)\B</b></TD>" | % {'"{0}","{1}"' -f $matches[1],$matches[2]} | Out-File Weather_Solar_Radiation.csv

    • Помечено в качестве ответа Anton Sashev Ivanov 24 июня 2016 г. 12:47
    22 июня 2016 г. 7:11

Все ответы

  • Файл D:\Temp\27\Weather_Summary_Vantage_Pro_Plus.htm выложите на обменник в исходном виде, т.к. у меня нет проьблем с его парсингом.
    PS D:\> (Get-Content D:\test.txt -Raw) -replace "&nbsp;"," " -match "(?s)(Solar Radiation:).+<b>(.+)\B</b></TD>" | % {"{0}
    {1}" -f $matches[1],$matches[2]}
    Solar Radiation: 517 W/m?

    21 июня 2016 г. 16:11
  • http://rgho.st/69DhCKb7m

    спасибо.
    22 июня 2016 г. 6:18
  • Никаких проблем:

    (gc .\Weather_Summary_Vantage_Pro_Plus.htm -Raw) -replace "&nbsp;"," " -match "(?s)(Solar Radiation:).+<b>(.+)\B</b></TD>" | % {'"{0}","{1}"' -f $matches[1],$matches[2]}
    "Solar Radiation:","517 W/m?"

    Для сохранения в файл , в конец добавить:

    | Out-File result.csv


    • Изменено Kazun 22 июня 2016 г. 6:30
    • Предложено в качестве ответа Kazun 22 июня 2016 г. 7:37
    • Помечено в качестве ответа Morn1ng 22 июня 2016 г. 7:57
    22 июня 2016 г. 6:27
  • спасибо, ЧЕЛОВЕЧИЩЕ, помог. всё работает )

    (gc .\Weather_Summary_Vantage_Pro_Plus.htm -Raw) -replace "&nbsp;"," " -match "(?s)(Solar Radiation:).+<b>(.+)\B</b></TD>" | % {'"{0}","{1}"' -f $matches[1],$matches[2]} | Out-File Weather_Solar_Radiation.csv

    • Помечено в качестве ответа Anton Sashev Ivanov 24 июня 2016 г. 12:47
    22 июня 2016 г. 7:11