用于在Python中删除重复HTML标记的正则表达式

时间:2017-02-07 03:40:55

标签: python html regex replace

我想减少

<p>
</p><p>
</p><p>
</p><p>
</p><p>
</p><p>
</p> abcabc </p><p>
</p><p> defdef </p><p>
 </p><p>
</p><p>
</p><p>
</p><p>
</p><p>
</p><p>
</p><p>
</p> xyzxyz

<p></p> abcabc </p><p>defdef</p><p></p> xyzxyz

我试试:

str.replace('</p><p>+', '</p><p>')

re.sub('</p><p>+', '</p><p>', str)

两者都没有运气,有什么建议吗?非常感谢。

3 个答案:

答案 0 :(得分:1)

替代方法:您可以使用 HTML解析器解决此问题,例如BeautifulSoup。我们的想法是找到除第一个之外的所有p个元素,并将它们从树中删除:

In [1]: from bs4 import BeautifulSoup

In [2]: data = "<p></p><p></p><p></p><p></p>"

In [3]: soup = BeautifulSoup(data, "html.parser")

In [4]: for p in soup('p')[1:]:
   ...:     p.decompose()   

In [5]: print(soup)
<p></p>

或者,您可以找到第一个p元素并删除所有下一个p兄弟姐妹:

In [6]: soup = BeautifulSoup(data, "html.parser")

In [7]: for p in soup.p.find_next_siblings('p'):
   ...:     p.decompose()  

In [8]: print(soup)
<p></p>

更新了更新问题的解决方案(使用空文本清理p元素):

In [10]: data = """<p>
    ...: </p><p>
    ...: </p><p>
    ...: </p><p>
    ...: </p><p>
    ...: </p><p>
    ...: </p> abcabc </p><p>
    ...: </p><p> defdef </p><p>
    ...:  </p><p>
    ...: </p><p>
    ...: </p><p>
    ...: </p><p>
    ...: </p><p>
    ...: </p><p>
    ...: </p><p>
    ...: </p> xyzxyz"""

In [11]: soup = BeautifulSoup(data, "html.parser")

In [12]: for p in soup.find_all("p", text=lambda text: not text.strip()):
    ...:     p.decompose()
    ...:     

In [13]: print(soup)
 abcabc <p> defdef </p> xyzxyz

答案 1 :(得分:0)

您可以尝试这样的事情:

import re

a="""<p>
</p><p>
</p><p>
</p><p>
</p><p>
</p><p>
</p> abcabc </p><p>
</p><p> defdef </p><p>
 </p><p>
</p><p>
</p><p>
</p><p>
</p><p>
</p><p>
</p><p>
</p> xyzxyz"""

print re.sub(r'</p><p>(?= ?</p><p>)', r'', re.sub(r'\n', r'', re.sub(r'<p>\n?</p>(?![ \w]+)', r'', a)))

输出:

<p></p> abcabc </p><p> defdef  </p><p></p> xyzxyz

答案 2 :(得分:0)

我不知道为什么以前的答案被删除了,但其中一个点击了以下代码:

str1= re.sub(r'\n', r'', re.sub(r'<p>\n?</p>(?![ \w]+)', r'', str1))

它实际上可以进一步简化:

str1= re.sub(r'\n', r'', re.sub(r'<p>\n?</p>', r'', str1))

如果谁再次发布该答案,则应该给予该人。