Python字符串操作,在html标记之间提取文本

时间:2011-10-27 03:46:00

标签: python html string parsing

我有一个字符串:

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

(它输出超过两行,因此必须有一个\ n。

我想提取<font></font>标签之间的字符串。在这种情况下,它是JUL 28,但它可能是另一个日期或其他数字。

1)从字体标签之间提取值的最佳方法是什么?我以为我可以在"></之间提取所有内容。

编辑:删除了第二个问题。

6 个答案:

答案 0 :(得分:9)

虽然可以用正则表达式解析任意HTML,但它通常是一个死亡陷阱。有很多很好的工具可以解析HTML,包括BeautifulSoup,这是一个可以很好地处理破解以及良好HTML的Python库。

>>> 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)

答案 1 :(得分:6)

这里有很多选项。您可以选择像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")

答案 2 :(得分:1)

或者,您只需使用Beautiful Soup

  

Beautiful Soup是一个Python HTML / XML解析器,专为快速周转项目而设计,如屏幕抓取

答案 3 :(得分:0)

grep是一个选项吗?

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

(。*)应符合您的内容。

答案 4 :(得分:0)

使用Scrapy的XPath选择器,如http://doc.scrapy.org/en/0.10.3/topics/selectors.html

所述

或者,您可以使用诸如BeautifulSoup之类的HTML解析器,尤其是如果您希望以面向对象的方式对文档进行操作。

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

答案 5 :(得分:0)

Python有一个名为HTMLParser的库。另请参阅SO中发布的以下问题,这与您正在寻找的内容非常相似:

How can I use the python HTMLParser library to extract data from a specific div tag?