从html代码中过滤掉空的<span>标记

时间:2015-12-12 17:00:28

标签: python html regex filter

我有一些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)

我想我在正则表达式上遗漏了一些内容以正确匹配这些行?

2 个答案:

答案 0 :(得分: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())

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

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

答案 1 :(得分:2)

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

>>> 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解析器来处理更复杂的解析任务。