REGEX - Найти TD с конкретным классом, включая вложенные таблицы - PullRequest
0 голосов
/ 09 июля 2009

Я должен разобрать кусок HTML. Это выглядит примерно так:

<table>
   <tr>
     <td class="blabla"> <table><tr><td><table><tr><td></td></tr></table></td></tr></table>
     </td>
   </tr>
  <tr>
     <td class="blabla"> <table><tr><td></td></tr></table>
     </td>
   </tr>
</table>

Мне нужно извлечь каждый td с классом blabla, но каждая из этих ячеек может иметь 0 или более вложенных таблиц с множеством вложенных td. Я хочу получить

<td class="blabla"> ... many nested stuff ... </td>

Спасибо

Ответы [ 6 ]

6 голосов
/ 09 июля 2009

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

Используйте анализатор HTML / XML в библиотеке, которую предоставляет ваш язык. System.Xml имеет ряд полезных классов, которые позволят вам открыть файл и запросить его с помощью XPath.

Вы ищите XPath-выражение:

//td[@class="someClass"]
4 голосов
/ 09 июля 2009

Если вам нужно выполнить расширенный html-анализ, я бы рекомендовал использовать Html Agility Pack вместо регулярных выражений. HAP создает XML-документ из HTML-страницы, чтобы вы могли искать конкретные узлы, используя XPath.

1 голос
/ 09 июля 2009

Почему вы не используете css-селекторы?

0 голосов
/ 09 июля 2009

Вы не можете сделать это просто используя регулярные выражения, потому что это слишком сложно. Даже при использовании сопоставления с предвкушением регулярное выражение должно будет динамически меняться, поскольку вам придется увеличивать число </td>, которое вы ищете, исходя из того, сколько <td> найдено после того, которое вы хотите.

0 голосов
/ 09 июля 2009

Вы бы искали регулярное выражение, похожее на /<td\sclass=\"(.*?)\">/, но я не знаю, как это сделать в .net.

Однако из-за того, как вы можете плохо формировать HTML, регулярное выражение не является хорошим кандидатом для разбора. Для этого есть гораздо лучшие инструменты.

Как уже упоминалось, использование XPath было бы неплохим способом сделать это, используя // td [@ class = "someClass"]. Это даст вам узел td. Затем вы можете получить содержимое этого и обработать его как требуется

0 голосов
/ 09 июля 2009

([Tt] [дБ] \ sclass = \ "блабла \")

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