регулярное выражение для разбора html (в c #) - PullRequest
4 голосов
/ 07 ноября 2008

Я пытаюсь разобрать HTML-страницу и извлечь 2 значения из строки таблицы. HTML для строки таблицы выглядит следующим образом: -

<tr>
<td title="Associated temperature in (ºC)" class="TABLEDATACELL" nowrap="nowrap" align="Left" colspan="1" rowspan="1">Max Temperature (ºC)</td>
<td class="TABLEDATACELLNOTT" nowrap="nowrap" align="Center" colspan="1" rowspan="1">6</td>
<td class="TABLEDATACELLNOTT" nowrap="nowrap" align="Center" colspan="1" rowspan="1"> 13:41:30</td>
</tr>

и выражение, которое у меня есть на данный момент:

<tr>[\s]<td[^<]+?>Max Temperature[\w\s]*</td>[\s]
<td[^<]+?>(?<value>([\d]+))</td>[\s]
<td[^<]+?>(?<time>([\d\:]+))</td>[\s]</tr>

Однако, похоже, я не могу извлечь ни одного совпадения. Кто-нибудь может указать мне правильное направление, спасибо.

Ответы [ 7 ]

4 голосов
/ 07 ноября 2008

Надежный анализ HTML с использованием регулярных выражений, как известно, чрезвычайно сложен.

Я думаю, я бы искал библиотеку для разбора HTML или библиотеку для "скрапинга экрана";)

Если HTML взят из ненадежного источника, вы должны быть очень осторожны, чтобы правильно обрабатывать вредоносный синтаксис HTML. Плохая обработка HTML является основным источником атак безопасности.

1 голос
/ 07 ноября 2008

Попробуйте

<tr>\s*
<td[^>]*>.*?</td>\s*
<td[^>]*>\s*(?<value>\d+)\s*</td>\s*
<td[^>]*>\s*(?<time>\d{2}:\d{2}:\d{2})\s*</td>\s*
</tr>\s*
0 голосов
/ 05 марта 2011

Вместо этого используйте Html Agility Pack или аналогичную библиотеку, как предлагает @Bjarke Ebert. Это правильный инструмент для этой задачи.

0 голосов
/ 07 ноября 2008

Я использую http://www.regexbuddy.com/ для таких элементов управления. До сих пор я проверял, что предложение @ sgehrig верно

0 голосов
/ 07 ноября 2008

«(ºC)» перед td закрытия сопоставлялось с:

<tr>[\s]<td[^<]+?>Max Temperature[^<]*</td>[\s]

Это \ w граница слова? Я думаю, что это немного сложно, я бы использовал более общий подход.

А в третьей строке после тега td есть один пробел, это учитывается?

<td[^<]+?>[\s]?(?<time>([\d\:]+))</td>[\s]</tr>
0 голосов
/ 07 ноября 2008
<tr>[\s]<td[^<]+?>Max Temperature[\w\s]*</td>[\s]

Пока не рассматривал все это, но это [^ <], вероятно, должно быть [^>], так как вы пытаетесь сопоставить все не-> до> того, что до максимальной температуры.

0 голосов
/ 07 ноября 2008

Когда вы пишете <td[^<]+?> Я думаю, вы действительно имеете в виду <td[^>]*>

То есть "открывающая скобка, тд, может быть что-то, кроме закрывающая скобка ..."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...