Как извлечь значения из HTML с помощью Regex?
-
26-10-2019 - |
Вопрос
Учитывая следующий HTML:
<p><span class="xn-location">OAK RIDGE, N.J.</span>, <span class="xn-chron">March 16, 2011</span> /PRNewswire/ -- Lakeland Bancorp, Inc. (Nasdaq: <a href='http://studio-5.financialcontent.com/prnews?Page=Quote&Ticker=LBAI' target='_blank' title='LBAI'> LBAI</a>), the holding company for Lakeland Bank, today announced that it redeemed <span class="xn-money">$20 million</span> of the Company's outstanding <span class="xn-money">$39 million</span> in Fixed Rate Cumulative Perpetual Preferred Stock, Series A that was issued to the U.S. Department of the Treasury under the Capital Purchase Program on <span class="xn-chron">February 6, 2009</span>, thereby reducing Treasury's investment in the Preferred Stock to <span class="xn-money">$19 million</span>. The Company paid approximately <span class="xn-money">$20.1 million</span> to the Treasury to repurchase the Preferred Stock, which included payment for accrued and unpaid dividends for the shares.  This second repayment, or redemption, of Preferred Stock will result in annualized savings of <span class="xn-money">$1.2 million</span> due to the elimination of the associated preferred dividends and related discount accretion.  A one-time, non-cash charge of <span class="xn-money">$745 thousand</span> will be incurred in the first quarter of 2011 due to the acceleration of the Preferred Stock discount accretion.  The warrant previously issued to the Treasury to purchase 997,049 shares of common stock at an exercise price of <span class="xn-money">$8.88</span>, adjusted for stock dividends and subject to further anti-dilution adjustments, will remain outstanding.</p>
Я хотел бы получить значения внутри <span>
элементы. Я также хотел бы получить ценность class
атрибут на <span>
элементы.
В идеале я мог бы просто запустить HTML через функцию и вернуть словарь извлеченных сущностей (на основе <span>
Расположение определено выше).
Приведенный выше код представляет собой фрагмент из более крупного источника html -файла, который не может привести к тому, что анализатор XML. Поэтому я ищу возможное регулярное выражение, чтобы помочь извлечь интересующую информацию.
Решение
Используйте этот инструмент (бесплатно):http://www.radsoftware.com.au/regexdesigner/
Используйте эту форму:
"<span[^>]*>(.*?)</span>"
Значения в группе 1 (для каждого матча) будут текстом, который вам нужен.
В C# это будет выглядеть как:
Regex regex = new Regex("<span[^>]*>(.*?)</span>");
string toMatch = "<span class=\"ajjsjs\">Some text</span>";
if (regex.IsMatch(toMatch))
{
MatchCollection collection = regex.Matches(toMatch);
foreach (Match m in collection)
{
string val = m.Groups[1].Value;
//Do something with the value
}
}
Подумал, чтобы ответить на комментарий:
Regex regex = new Regex("<span class=\"(.*?)\">(.*?)</span>");
string toMatch = "<span class=\"ajjsjs\">Some text</span>";
if (regex.IsMatch(toMatch))
{
MatchCollection collection = regex.Matches(toMatch);
foreach (Match m in collection)
{
string class = m.Groups[1].Value;
string val = m.Groups[2].Value;
//Do something with the class and value
}
}
Другие советы
Предполагая, что у вас нет вложенное теги SPAN, следующее должно работать:
/<span(?:[^>]+class=\"(.*?)\"[^>]*)?>(.*?)<\/span>/
Я провел только какое -то базовое тестирование, но оно будет соответствовать классу тега SPAN (если он существует) вместе с данными, пока тег не будет закрыт.
я сильно Посоветуйте вам использовать настоящий HTML или XML -анализатор для этого. Вы не можете надежно разобрать HTML или XML с регулярными выражениями-Насколько вы можете сделать,-это приблизиться, и чем ближе вы приближаетесь, тем более запутанным и трудоемким будет ваша корпорация. Если у вас есть большой HTML -файл для анализа, он, скорее всего, сломает какой -либо простой шаблон режима.
Regex нравится <span[^>]*>(.*?)</span>
будет работать над вашим примером, но есть много кода XML-Valid, который сложно или даже невозможно разобрать с помощью Regex (например,, например, <span>foo <span>bar</span></span>
сломает вышеуказанный шаблон). Если вы хотите что -то, что будет работать над другими HTML -образцами, Regex - это не то, чтобы пойти сюда.
Поскольку ваш HTML-код не является xml-valid, рассмотрите HTML Agility Pack, что я слышал, очень хорошо.