【问题标题】:Python: Separating an HTML snippets to paragraphsPython:将 HTML 片段分隔为段落
【发布时间】:2011-01-17 14:56:50
【问题描述】:

我有一个包含段落的 HTML 的 sn-p。 (我的意思是p 标签。)我想将字符串分成不同的段落。例如:

'''
<p class="my_class">Hello!</p>
<p>What's up?</p>
<p style="whatever: whatever;">Goodbye!</p>
'''

应该变成:

['<p class="my_class">Hello!</p>',
 '<p>What's up?</p>'
 '<p style="whatever: whatever;">Goodbye!</p>']

解决这个问题的好方法是什么?

【问题讨论】:

标签: python html beautifulsoup lxml


【解决方案1】:

如果您的字符串仅包含段落,您可以使用精心制作的正则表达式和re.split() 来摆脱困境。但是,如果您的字符串是更复杂的 HTML,或者并非总是有效的 HTML,您可能需要查看 BeautifulSoup 包。

用法如下:

from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(some_html)

paragraphs = list(unicode(x) for x in soup.findAll('p'))

【讨论】:

  • 正则表达式是错误的工具。 HTML 不是常规语言,因此正则表达式天生无法解析 HTML。使用 HTML 解析器,就像您在帖子的后半部分中展示的那样,更加健壮、更容易和可读。
【解决方案2】:

使用lxml.html 将HTML 解析为您想要的形式。这与推荐 BeautifulSoup 的人的建议基本相同,只是 lxml 仍在积极开发中,而 BeatifulSoup 的开发已经放缓。

【讨论】:

    【解决方案3】:

    使用 BeautifulSoup 解析 HTML 并遍历段落。

    【讨论】:

    • BeautifulSoup 也可以,但仅在 html 可能丑陋/无效时才需要。 stdlib etree 也可以做到这一点。我更喜欢 lxml 因为它更强大。曾经有人谈论将 BeautifulSoup 加入其中。我不知道它去了哪里。
    • xml.etree 可以解析XML,问题中的代码不是。
    • 我相信我已经用它来解析 html。也许我记错了。但这似乎证实了我的记忆:effbot.org/zone/element-index.htm#usage
    • 或者问题是我们这里只有一个 sn-p...?
    【解决方案4】:

    xml.etree (std lib) 或 lxml.etree (enhanced) 使这很容易做到,但我不会得到答案,因为我不记得确切的语法。我一直把它和类似的包混在一起,每次都要重新查找。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2014-06-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多