Как извлечь значения из HTML с помощью RegEx? - PullRequest
2 голосов
/ 16 марта 2011

Учитывая следующий 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. &#160;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. &#160;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. &#160;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.Поэтому я ищу возможное регулярное выражение для извлечения интересующей информации.

Ответы [ 3 ]

7 голосов
/ 16 марта 2011

Используйте этот инструмент (бесплатно): 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
                }
            }
2 голосов
/ 16 марта 2011

Если у вас нет вложенных тегов span, то должно работать следующее:

/<span(?:[^>]+class=\"(.*?)\"[^>]*)?>(.*?)<\/span>/

Я провел только базовое тестирование, но он будет соответствовать классу тега span (если он существует) вместе с данными до тех пор, пока тег не будет закрыт.

1 голос
/ 16 марта 2011

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

Регулярное выражение, подобное <span[^>]*>(.*?)</span>, будет работать на вашем примере, но есть много XML-корректного кода, который трудно или даже невозможно проанализировать с регулярным выражением (например, <span>foo <span>bar</span></span> нарушит вышеуказанный шаблон). Если вы хотите что-то, что будет работать с другими примерами HTML, регулярное выражение не является подходящим способом.

Поскольку ваш HTML-код не является XML-допустимым, рассмотрим HTML Agility Pack , который, как я слышал, очень хорош.

...