2010-01-04 73 views
2

我正在研究「個人可以工作」的事情,並且除了嘗試從.asp源文件解析某些信息到我的程序之外, 。C#颳去HTML/.asp

這是解析代碼我到目前爲止

// parse out the results 
      try 
      { 
       int snr_start = result.IndexOf("SNR"); 
       int snr_end = result.IndexOf("</TR>", snr_start); 
       snr = result.Substring(snr_start, snr_end - snr_start); 
       snr = snr.Substring(snr.IndexOf("<TD>") + 1); 
       snr = snr.Substring(0, snr.Length - 6); 
       iSNR = Convert.ToInt32(snr.Substring(0, snr.IndexOf(" "))); 

       int dnpwr_start = result.IndexOf("Downstream Power", snr_end); 
       int dnpwr_stop = result.IndexOf("</TR>", dnpwr_start); 
       dnpwr = result.Substring(dnpwr_start, dnpwr_stop - dnpwr_start); 
       dnpwr = dnpwr.Substring(dnpwr.IndexOf("<TD>") + 1); 
       dnpwr = dnpwr.Substring(0, dnpwr.IndexOf("<TABLE") - 1); 
       iDPWR = Convert.ToInt32(dnpwr.Substring(0, dnpwr.IndexOf(" "))); 

       int uppwr_start = result.IndexOf("Upstream Power", dnpwr_stop); 
       int uppwr_stop = result.IndexOf("</TR>", uppwr_start); 
       uppwr = result.Substring(uppwr_start, uppwr_stop - uppwr_start); 
       uppwr = uppwr.Substring(uppwr.IndexOf("<TD>") + 1); 
       uppwr = uppwr.Substring(0, uppwr.IndexOf("</TD>") - 1); 
       iUPWR = Convert.ToInt32(uppwr.Substring(0, uppwr.IndexOf(" "))); 
      } 
      catch 

這是SourceFile和我試圖從它(SNR,下行功率,上行功率)刮信息

<td class="headerR">Downstream Power</td> 
<td class="contentL">1.0 dBmV</td> 
</tr> 
<tr> 
<td class="headerR">SNR</td> 
<td class="contentL">39.656 dB</td> 
</tr> 
<tr> 
<td class="headerR">Upstream Power</td> 
<td class="contentL">42.0 dBmV</td> 
</tr> 

不太確定我哪裏去錯了,但任何幫助將大大appreaciated。 該項目的重點是,我可以解析我的調制解調器(我是MSO員工)的信號電平以進行擴展監控。如果需要,我可以從.asp頁發佈完整的源

謝謝, 馬特

回答

0

我不是使用屏幕抓取這些字符串方法,除非這是你最後的手段過於激烈。

你可以嘗試使用一些正則表達式......或者甚至更好,如果你可以保證你的HTML源代碼格式正確(XHTML),你可以將它加載(或者你想要的XML片段)到一個XML文檔對象中如果使用.NET 3.5,則使用XPath或Linq-to-XML(XLinq)。

0

ASP來源?你最好的選擇可能是一個正則表達式 - 他們是爲這種任務而設計的。任何形式的刮擦通常意味着它將值得您一段時間去挖掘它們。

你用什麼樣的語言來解析它?如果.Net,您可以使用Regex類輕鬆獲得名稱/值對。

像這樣的正則表達式:

"<tr>\s*<td\s+class\s*=\s*\"headerR\"\s*>\s*(?<name>[^<])\s*</td\s*>\s*<td\s+class\s*=\s*\"contentL\"\s*>\s*(?<value>[^<])\s*</td\s*>\s*</tr\s*>" 

然後,您可以循環throught的捕獲和你的名字值對列表:

「下行功率」: 「1.0 dBmV的」 「 SNR「:」39.656 dB「 」上游功率「:」42.0 dbmV「

應該很簡單。

0

這應該工作,如果你只是想從一個表提取數據:

int start = result.IndexOf("<table>"); 
int end = result.IndexOf("</table>", start) + 8; 
var doc = new XmlDocument(); 
doc.LoadXml(result.Substring(start, end - start); 

iSNR = Convert.ToInt32(doc.SelectSingleNode("following-sibling::tr/td[text() = 'SNR']").InnerText.Split(' ')[0]); 
iDPWR = Convert.ToInt32(doc.SelectSingleNode("following-sibling::tr/td[text() = 'Downstream Power']").InnerText.Split(' ')[0]); 
iUPWR = Convert.ToInt32(doc.SelectSingleNode("following-sibling::tr/td[text() = 'Upstream Power']").InnerText.Split(' ')[0]);