2010-01-04 3 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 

И это Исходный_файл и Информационным я пытаюсь скрести от него (SNR, Downstream Power, Upstream мощности)

<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> 

Не слишком уверен, где я ошибаюсь, но любая помощь может быть значительно воспринята. В центре внимания проекта так, что я могу разобрать уровни сигнала моего модема (я сотрудник MSO) для расширенного мониторинга. В случае необходимости я могу опубликовать полный исходный код со страницы .asp

Спасибо, Matt

ответ

0

Я не слишком заинтересован в использовании этих методов строки для экрана соскоба, если это не в последнюю очередь.

Вы можете попробовать использовать некоторые Regex ... или даже лучше, если вы можете гарантировать, что ваш HTML-источник хорошо сформирован (XHTML), вы можете загрузить его (или фрагмент XML, который вы хотите) в объект XML-документа и используйте XPath или Linq-to-XML (XLinq), если используете .NET 3.5.

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*>" 

Затем вы можете цикл Повсеместно захватов и получить список пар имя-значение:

«Downstream Power»: «1.0 дБмВ» " SNR ":" 39,656 дБ " " Выходная мощность ":" 42,0 дБмВ "

Должно быть просто.

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]);