【问题标题】:Python string operation, extract text between html tagsPython字符串操作,提取html标签之间的文本
【发布时间】:2011-12-16 05:24:38
【问题描述】:

我有一个字符串:

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

(它输出两行,所以里面必须有一个\n。

我希望提取&lt;font&gt;&lt;/font&gt; 标签之间的字符串。在这种情况下,它是 7 月 28 日,但它可能是另一个日期或其他数字。

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

编辑:删除第二个问题。

【问题讨论】:

  • 注意,
    这应该是两个独立的问题..
  • 你可能是对的。让我们忽略第二个。以后我会担心的。

标签: python html string parsing


【解决方案1】:

虽然可以使用正则表达式解析任意 HTML,但这通常是一个死亡陷阱。有很多很棒的工具可以解析 HTML,包括 BeautifulSoup,这是一个 Python 库,可以很好地处理 broken 以及良好的 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)

【讨论】:

  • 不错!这似乎比正则表达式方式简单得多。
  • @FluxCapacitor 一个警告:我上面对strptime 的第二个参数实际上是一个特定于语言环境的示例。如果您需要与语言环境无关或不同语言环境的解决方案,请参阅documentation 了解更多详细信息。
【解决方案2】:

这里有很多选择。尽管您似乎想要一个特定于域的解决方案,但您可以选择像 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")

【讨论】:

  • 您评论了 AnthonyHurst 的回答,即这是来自一个网站。最近使用lxml的html解析非常成功,强烈推荐。
  • 谢谢!我在另一个问题中看到了与正则表达式类似的东西,但无法使其工作。您的解决方案非常适合我。缺点是我只了解它发生了什么。
【解决方案3】:

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

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

【讨论】:

【解决方案4】:

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

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

【讨论】:

  • 可能有点矫枉过正,但如果需要进行更多的 HTML 解析,这是一个不错的选择。
【解决方案5】:

grep 是一个选项吗?

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

(.*) 应该与您的内容相匹配。

【讨论】:

  • 我在 Python 中做这一切...我使用 scrapy 抓取网页并向下钻取到上面的字符串。
  • 抱歉,我无法为您提供更好的帮助。你总是可以使用 re(正则表达式)库来获取相同的东西。
【解决方案6】:

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

您也可以使用 HTML 解析器,例如 BeautifulSoup,特别是如果您想以面向对象的方式对文档进行操作。

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

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签