C # Соскребание HTML / .asp - PullRequest
       27

C # Соскребание HTML / .asp

2 голосов
/ 05 января 2010

Я работаю над чем-то вроде «персональная работа», и у меня все отлично работает, за исключением попытки проанализировать некоторую информацию из исходного файла .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, нисходящая мощность, восходящая мощность)

<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

Ответы [ 3 ]

0 голосов
/ 05 января 2010

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

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

«Мощность на выходе»: «1,0 дБмВ» «SNR»: «39,656 дБ» «Мощность в восходящем направлении»: «42,0 дБмВ»

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

0 голосов
/ 05 января 2010

Это должно работать, если вы хотите извлечь данные только из одной таблицы:

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]);
0 голосов
/ 05 января 2010

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

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

...