我想减少
<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)
两者都没有运气,有什么建议吗?非常感谢。
答案 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))
如果谁再次发布该答案,则应该给予该人。