c#
  • html
  • html-agility-pack
  • httpwebresponse
  • 2016-11-07 80 views 5 likes 
    5

    我想解析一些HTML響應的值,然後將它們插入到SQL中。我能夠得到兩個值,但是,因爲代碼被包裝在一個foreach語句中,所以我得到了它們兩次。從Web響應中獲取HTML值

    這裏是我的HTML響應

    <div align="CENTER" class='dataTitle'>Host State Breakdowns:</div> 
    <p align='center'> 
    <a href='trends.cgi?host=hostname&includesoftstates=no&assumeinitialstates=yes&initialassumedhoststate=0&backtrack=4'><img src='trends.cgi?createimage&host=hostname&includesoftstates=no&initialassumedhoststate=0&backtrack=4' border="1" alt='Host State Trends' title='Host State Trends' width='500' height='20'></a><br> 
    </p> 
    <div align="CENTER"> 
    <table border="0" class='data'> 
    <tr><th class='data'>State</th><th class='data'>Type/Reason</th><th class='data'>Time</th><th class='data'>% Total Time</th><th class='data'>% Known Time</th></tr> 
    <tr class='dataEven'><td class='hostUP' rowspan="3">UP</td><td class='dataEven'>Unscheduled</td><td class='dataEven'>0d 10h 5m 19s</td><td class='dataEven'>100.000%</td><td class='dataEven'>100.000%</td></tr> 
    <tr class='dataEven'><td class='dataEven'>Scheduled</td><td class='dataEven'>0d 0h 0m 0s</td><td class='dataEven'>0.000%</td><td class='dataEven'>0.000%</td></tr> 
    <tr class='hostUNREACHABLE'><td class='hostUNREACHABLE'>Total</td><td class='hostUNREACHABLE'>0d 0h 0m 0s</td><td class='hostUNREACHABLE'>0.000%</td><td class='hostUNREACHABLE'>0.000%</td></tr> 
    <tr class='dataOdd'><td class='dataOdd' rowspan="3">Undetermined</td><td class='dataOdd'>Nagios Not Running</td><td class='dataOdd'>0d 0h 0m 0s</td><td class='dataOdd'>0.000%</td><td class='dataOdd'></td></tr> 
    <tr class='dataOdd'><td class='dataOdd'>Insufficient Data</td><td class='dataOdd'>0d 0h 0m 0s</td><td class='dataOdd'>0.000%</td><td class='dataOdd'></td></tr> 
    <tr class='dataOdd'><td class='dataOdd'>Total</td><td class='dataOdd'>0d 0h 0m 0s</td><td class='dataOdd'>0.000%</td><td class='dataOdd'></td></tr> 
    <tr><td colspan="3"></td></tr> 
    <tr class='dataEven'><td class='dataEven'>All</td><td class='dataEven'>Total</td><td class='dataEven'>0d 10h 5m 19s</td><td class='dataEven'>100.000%</td><td class='dataEven'>100.000%</td></tr> 
    </table> 
    </div> 
    <br><br> 
    <div align="CENTER" class='dataTitle'>State Breakdowns For Host Services:</div> 
    <div align="CENTER"> 
    <table border="0" class='data'> 
    <tr><th class='data'>Service</th><th class='data'>% Time OK</th><th class='data'>% Time Warning</th><th class='data'>% Time Unknown</th><th class='data'>% Time Critical</th><th class='data'>% Time Undetermined</th></tr> 
    <tr class='dataOdd'><td class='dataOdd'><a href='avail.cgi?host=hostname&service=servicename&t1=1478498400&t2=1478534719&backtrack=4&assumestateretention=yes&assumeinitialstates=yes&assumestatesduringnotrunning=yes&initialassumedhoststate=0&initialassumedservicestate=0&show_log_entries&showscheduleddowntime=yes&rpttimeperiod=24x7'>servicename</a></td><td class='serviceOK'>100.000% (100.000%)</td><td class='serviceWARNING'>0.000% (0.000%)</td><td class='serviceUNKNOWN'>0.000% (0.000%)</td><td class='serviceCRITICAL'>0.000% (0.000%)</td><td class='dataOdd'>0.000%</td></tr> 
    <tr class='dataEven'><td class='dataEven'><a href='avail.cgi?host=hostname&service=servicename2&t1=1478498400&t2=1478534719&backtrack=4&assumestateretention=yes&assumeinitialstates=yes&assumestatesduringnotrunning=yes&initialassumedhoststate=0&initialassumedservicestate=0&show_log_entries&showscheduleddowntime=yes&rpttimeperiod=24x7'>servicename2</a></td><td class='serviceOK'>100.000% (100.000%)</td><td class='serviceWARNING'>0.000% (0.000%)</td><td class='serviceUNKNOWN'>0.000% (0.000%)</td><td class='serviceCRITICAL'>0.000% (0.000%)</td><td class='dataEven'>0.000%</td></tr> 
    </table> 
    </div> 
    

    這裏是我的代碼:

    var response = (HttpWebResponse)request.GetResponse(); 
    var stream = response.GetResponseStream(); 
    HtmlDocument doc = new HtmlDocument(); 
    doc.Load(stream); 
    
    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//table[@class]")) 
    { 
    
        foreach (HtmlNode node2 in node.SelectNodes("//td[@class = 'serviceOK']")) 
        { 
         var value = node2.InnerText; 
        } 
    
        foreach (HtmlNode node3 in node.SelectNodes("//a[contains(@href, 'avail.cgi')]")) 
        { 
         var name = node3.InnerText; 
        } 
    
    } 
    

    名稱顯示服務名和值顯示類serviceOK但它再次重複,因爲第一次的foreach本身。

    我的結果是這樣的:

    100.000% (100.000%) 
    100.000% (100.000%) 
    servicename 
    servicename2 
    100.000% (100.000%) 
    100.000% (100.000%) 
    servicename 
    servicename2 
    

    有沒有一種方法,首先,匹配值了,二,只有讓他們展示一次?

    回答

    3

    您的第一個foreach遍歷整個文檔,就像第一個foreach語句中的兩個foreach語句一樣。
    因爲有2個符合XPath表達式表元素

    "//table[@class]" 
    

    你得到你的答案的兩倍。如果你有更多的表格元素匹配你的XPath表達式,例如說7,你會得到7次結果。

    你想要的是找到表中的錶行(tr)內的類「serviceOK」的所有表格分區(td)。 一旦你有了這個HtmlNode,你可以去前面的兄弟姐妹,它將包含服務名稱。

    var response = (HttpWebResponse)request.GetResponse(); 
    var stream = response.GetResponseStream(); 
    HtmlDocument doc = new HtmlDocument(); 
    doc.Load(stream); 
    
    foreach (HtmlNode serviceOkNode in doc.DocumentNode.SelectNodes("//table[@class]/tr/td[@class = 'serviceOK']")) 
    { 
        HtmlNode serviceNameNode = serviceOkNode.PreviousSibling; 
        var value = serviceOkNode.InnerText; 
        var name = serviceNameNode.InnerText; 
    } 
    
    +0

    非常感謝你。我知道第一個foreach正在拋棄我,但我無法弄清楚我需要爲SelectNodes使用什麼。再次感謝你 – maltman

    相關問題