2011-10-27 2 views
3

У меня есть строка:.Python строковой операции, извлекать текст между HTML-теги

<font face="ARIAL,HELVETICA" size="-2"> 
JUL 28   </font> 

(он выдает на две строки, так что должно быть а \ п там

Я хочу, чтобы извлечь строка, которая находится между тегами <font></font>. В этом случае это JUL 28, но это может быть другая дата или какой-либо другой номер.

1) Лучший способ извлечь значение из тегов шрифтов? Я думал, что могу извлечь все между "> и </.

редактирование: второй вопрос удален.

+0

Отметим, что тег не всегда то же самое –

+1

Это должно вероятно. быть двумя отдельными вопросами .. –

+0

Возможно, вы правы. Давайте проигнорируем второй. Я буду беспокоиться об этом позже. –

ответ

9

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

>>> from BeautifulSoup import BeautifulSoup as BSHTML 
>>> BS = BSHTML(""" 
... <font face="ARIAL,HELVETICA" size="-2"> 
... JUL 28   </font>""" 
...) 
>>> BS.font.contents[0].strip() 
u'JUL 28' 

Тогда вам просто необходимо разобрать дату:

>>> datetime.strptime(BS.font.contents[0].strip(), '%b %d') 
>>> datetime.datetime(1900, 7, 28, 0, 0) 
datetime.datetime(1900, 7, 28, 0, 0) 
+0

Ницца! Это кажется гораздо менее сложным, чем регулярное выражение. –

+0

@FluxCapacitor Предупреждающее слово: мой второй аргумент для 'strptime' выше на самом деле является примером, специфичным для локали. Пожалуйста, обратитесь к [документации] (http://docs.python.org/library/datetime.html#strftime-strptime-behavior) для получения более подробной информации, если вам требуется языковое агностическое или другое языковое решение. – kojiro

0

Есть ли вариант grep?

grep "<[^>]*>(.*)<\/[^>]*>" file 

(. *) Должен соответствовать вашему контенту.

+0

Я делаю все это в Python ...Я использовал scrapy, чтобы очистить веб-страницу и развернуть, чтобы добраться до строки выше. –

+0

Извините, я не смог помочь вам лучше. вы всегда можете использовать библиотеку re (регулярное выражение), чтобы захватить одну и ту же вещь. – AnthonyHurst

+0

Ну, вы могли бы использовать подпроцесс и все еще выполнять команду –

5

У вас здесь есть множество вариантов. Вы можете использовать полный XML-анализатор, такой как lxml, хотя вам, похоже, требуется решение для конкретного домена. Я бы с многострочным регулярным выражением:

import re 
rex = re.compile(r'<font.*?>(.*?)</font>',re.S|re.M) 
... 
data = """<font face="ARIAL,HELVETICA" size="-2"> 
JUL 28   </font>""" 

match = rex.match(data) 
if match: 
    text = match.groups()[0].strip() 

Теперь, когда у вас есть text, вы можете превратить его в дату довольно легко:

from datetime import datetime 
date = datetime.strptime(text, "%b %d") 
+0

Вы прокомментировали ответ AnthonyHurst, что это с сайта. Недавно я использовал синтаксический анализ html lxml с большим успехом, я очень рекомендую его. – fahhem

+0

Спасибо! Я видел что-то подобное с регулярными выражениями в другом вопросе, но не смог заставить его работать. Ваше решение отлично работало для меня. Недостатком является то, что я только понимаю, что с ним происходит. –

1

Или вы могли бы просто использовать Beautiful Soup:

Beautiful Soup - это парсер Python HTML/XML, предназначенный для быстрого развития проектов, таких как скрининг экрана

+0

Наверное, излишний, но хороший выбор, если будет больше разбора HTML. –

0

XPath селекторы Используйте Scrapy как документировано в http://doc.scrapy.org/en/0.10.3/topics/selectors.html

В качестве альтернативы вы можете использовать HTML-парсер, такие как BeautifulSoup особенно, если хотите работать над документом в объектно-ориентированном образом.

http://pypi.python.org/pypi/BeautifulSoup/3.2.0

Смежные вопросы