从html代码中过滤出空的<span>标签

3

我有一些HTML代码,其中有很多行我想要删除的内容看起来像这样

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

现在有一些包含文本的span标签,我想保留这些文本。 我想使用Python re.sub函数删除那些无用的span标签。 我写了以下代码,但它没有起作用。
html_code_filtered = re.sub('<span*></span>', '', html_code)

我猜我在正则表达式上漏掉了某些东西,以正确匹配这些行?

1
如果可能的话,针对这种问题使用BeautifulSoup。请参见http://www.crummy.com/software/BeautifulSoup/ - maazza
当一个 span 标签仅包含 img 标签时会发生什么? - Casimir et Hippolyte
在这种情况下,它不会被删除,但我不必处理这样的事情,因为在我处理的HTML文件中不会发生这种情况。 - Atirag
2个回答

6
你可以使用像 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())

打印输出(可以看到没有内容的元素已被移除):

<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解析器的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接