【问题标题】:Filter out empty <span> tags from html code从 html 代码中过滤掉空的 <span> 标签
【发布时间】:2016-03-18 11:39:13
【问题描述】:

我有一些 html 代码,其中有很多行要删除,看起来像这样

<span style="position:absolute; border: black 1px solid; left:94px; top:600px; width:6px; height:10px;"></span>

现在还有跨度标签,它们之间有文本,我想保留。

我想用python re.sub 函数来删除那些无用的span标签。我写了这个,但它不起作用

html_code_filtered = re.sub('<span*></span>', '', html_code)

我想我在正则表达式中遗漏了一些东西来正确匹配行?

【问题讨论】:

  • 如果可能,请使用 beautifullsoup 解决此类问题,请参阅crummy.com/software/BeautifulSoup
  • 当一个 span 标签包含例如一个 img 标签时会发生什么?
  • @CasimiretHippolyte 在这种情况下,它不会被删除,但我不必处理类似的事情,因为这不会发生在我正在处理的 html 文件中。

标签: python html regex filter


【解决方案1】:

您可以使用像 BeautifulSoup 这样的 HTML 解析器来删除没有文本的 span 元素。

工作示例:

from bs4 import BeautifulSoup

data = """
<div>
    <span style="position:absolute; border: black 1px solid; left:94px; top:600px; width:6px; height:10px;"></span>
    <span>useful text</span>
    <span></span>
</div>
"""

soup = BeautifulSoup(data, "html.parser")

# find and remove "span" elements with empty contents
for useless in soup.find_all("span", text=lambda text: not text):
    useless.extract()

print(soup.prettify())

打印(如您所见,span 没有内容的元素已被删除):

<div>
 <span>
  useful text
 </span>
</div>

【讨论】:

    【解决方案2】:

    这里的问题是n* 寻找重复零次或多次的字符n。您可以使用.*? 匹配所有字符,直到下一个 > 字符。

    >>> html_code = '<span style="position:absolute; border: black 1px solid; left:94px; top:600px; width:6px; height:10px;"></span>' 
    >>> re.sub('<span.*?></span>', '', html_code)
    ''
    

    话虽如此,请参阅 maazaa 的评论和答案,使用适当的 html 解析器进行更复杂的解析任务。

    【讨论】:

      猜你喜欢
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多