2012-02-15 3 views
0

У меня проблема с регулярными выражениями на C#. Я хочу проанализировать html-код простой веб-страницы. Это выглядит следующим образом:C# анализ html-кода с помощью Regex

<td class="ivu_table_c_dep"> 12:05 </td> 
<td class="ivu_table_c_line"> Bus 398 </td> 
<td> 
<img src="/IstAbfahrtzeiten/img/css/link.gif" alt="" />&nbsp; 
    <a class="catlink" href="http://mobil.bvg.de/Fahrinfo/bin/stboard.bin/dox?boardType=dep&input=S Mahlsdorf!&time=12:05&date=15.02.2012&&amp;" title="interner Link: Information zu dieser Haltestelle">S Mahlsdorf</a> 

То, что я хочу знать "12:05", "Автобус 398" и "S Mahlsdorf". В первых двух частях я заставляю его работать со следующим кодом:

Regex HTMLTag = new Regex("ivu_table_c_dep\">([^<>]*)</td>([^<>]*)<td class=\"ivu_table_c_line\">([^<>]*)</td>"); 

Но я не получаю 3. часть. Я пытался добавить "([^ (\">)] ) ([^ <>])»Но doesnt't работа

+1

Обязательно: http://stackoverflow.com/questions/677038/how-to-use-regular-expressions-to -parse-html-in-java – Oded

+1

Еще более обязательным: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

ответ

0

Это нормально использовать регулярное выражение как быстрое и грязное решение, когда вы знаете структуру текста. В конце концов, люди здесь клонировать объекты по сериализации и десериализации их ... Вы бы лучше с небольшой вспомогательной функцией, как этот:

static string gettext(string text, string tag, string cl) { 
    string re = string.Format(@"<\s*{0}[^>]+?class\s*=\s*[""']?{1}[^>]*>([^<]*)", tag, cl); 
    return Regex.Match(text, re).Groups[1].Value; 
} 

Хрупкая, она по-прежнему можно использовать в простых случаях, как твой. Он извлекает текст (первый текстовый узел, на самом деле) из данного тега данного класса:

Console.WriteLine(gettext(text, "td", "ivu_table_c_dep")); // 12:05 
Console.WriteLine(gettext(text, "td", "ivu_table_c_line")); // Bus 398 
Console.WriteLine(gettext(text, "a", "catlink"));   // S Mahlsdorf 
1

Используйте HTML Agility Pack для анализа и запроса HTML вместо Regex.. - см this answer для неоспоримых причин Regex является плохим решением для разбора HTML в целом.

Это проворный HTML-парсер, который строит для чтения/запись DOM и поддерживает простой XPATH или XSLT (вы на самом деле не имеете для понимания XPATH или XSLT, чтобы использовать его, не беспокойтесь ...). Это библиотека .NET-кода, которая позволяет анализировать HTML-файлы вне Интернета. Парсер очень терпим к «реальному миру», HTML. Объектная модель очень похожа на t предлагает System.Xml, но для документов HTML (или потоков).

Html Agility Pack теперь поддерживает Linq для объектов (через интерфейс LINQ to Xml Like). Ознакомьтесь с новой бета-версией, чтобы сыграть с этой функцией.