【问题标题】:Remove multiline HTML in Python在 Python 中删除多行 HTML
【发布时间】:2016-06-14 20:32:38
【问题描述】:

我正在尝试去除特定的 HTML 文档块,尤其是 Javascript (<script></script>) 和内联 CSS (<style></style>)。目前我正在尝试使用re.sub(),但对 Multiline 没有任何运气。有什么建议吗?

import re

s = '''<html>
<head>
  <title>Some Template</title>
  <script type="text/javascript" src="{path to Library}/base.js"></script>
  <script type="text/javascript" src="something.js"></script>
  <script type="text/javascript" src="simple.js"></script>
</head>
<body>
  <script type="text/javascript">
    // HelloWorld template
    document.write(examples.simple.helloWorld());
  </script>
</body>
</html>'''

print(re.sub('<script.*script>', '', s, count=0, flags=re.M))

【问题讨论】:

  • 你为什么不去BeautifulSoup
  • @JasonEstibeiro 我对 BeautifulSoup 的了解并不广泛,但我所有的用途都是解析 HTML 和提取内容。我只想清除其中的一部分,并将其他部分(如粗体和斜体标签)转换为不同的标记。我不知道 BS4 能够做到这一点。
  • 好吧,您可以清除部分 HTML。看看这个answer
  • 您甚至可以通过更改其标记名称和/或属性来修改 HTML 树。看看doc
  • @JasonEstibeiro 嗯...我会的。把它放在答案中,功劳归你所有。

标签: python html regex python-3.x


【解决方案1】:

或者,由于您正在解析和修改 HTML,我建议使用像 BeautifulSoup 这样的 HTML 解析器。

如果您只是想剥离/删除 HTML 树中的所有 script 标记。您可以使用.decompose().extract()

.extract()返回提取的标签,而.decompose() 将简单地销毁它。

from bs4 import BeautifulSoup

soup = BeautifulSoup(s, "html.parser")
for i in soup('script'):
    i.decompose()

print(soup)

正如 cmets 中所讨论的,您可以对 HTML 树进行其他修改。您可以参考docs 了解更多信息。

【讨论】:

    【解决方案2】:

    你实际上需要 DOTALL 修饰符而不是 Multiline 。

    print(re.sub(r'(?s)<script\b.*?</script>', '', s))
    

    这将删除script 标记之前存在的前导空格。

    print(re.sub(r'(?s)\s*<script\b.*?</script>', '', s))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多