2011-10-27 119 views
3

我有一个字符串:Python字符串操作,提取html标签之间的文本

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

(它输出超过两行,所以必须有一个\ n在那里

我想提取字符串在<font></font>标签之间,在这种情况下,它是7月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

这里有一堆选项。尽管您似乎想要一个特定于域的解决方案,但您可以使用像lxml这样的全面的xml解析器。我用正则表达式多走:

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的答案,这是来自一个网站。我最近使用了lxml的html解析并取得了很大的成功,我强烈推荐它。 – fahhem

+0

谢谢!我在另一个问题中看到了与正则表达式类似的东西,但无法使其工作。你的解决方案对我来说非常合适缺点是我只能理解它发生了什么。 –

1

或者,你可以简单地使用Beautiful Soup

美丽的汤是一个Python的HTML/XML分析器设计用于快速周转项目,如屏幕刮

+0

如果还有更多的HTML解析工作可能会过度,但是一个不错的选择。 –

相关问题