我有一些来源,我试图删除一些标签,我知道不建议使用正则表达式删除标签,但我认为这是最简单的方法。
我需要做的是删除所有 img
和 a
标签以及 a
标签的内容 在 p
标签内,但我不确定如何使用正则表达式来做到这一点。
比如遇到的时候:
<p><img src="center.jpg"><a href="?center">center</a>TEXT<img src="right.jpg"><a href="?rightspan">right</a> MORE TEXT<img src="another.jpg"></p>
输出应如下所示,其中删除了所有 a
标签和内容以及 img
标签。
<p>TEXT MORE TEXT</p>
问题就像我说的那样,我不确定该怎么做,我的正则表达式删除了所有 a
和 img
源代码中的标签,而不仅仅是 p
标签内的标签。
re.sub(r'<(img|a).*?>|</a>', '', text)
最佳答案
您的正则表达式确实会在不使用某种类型的断言的情况下删除所有标签。尽管您可以使用正则表达式来执行此操作,但出于多种原因,我建议不要采用这种方式。
您可以简单地使用 BeautifulSoup
传递要删除的内容的列表。
>>> from BeautifulSoup import BeautifulSoup
>>> html = '<p><img src="center.jpg"><a href="?center">center</a>TEXT<img src="right.jpg"><a href="?rightspan">right</a> MORE TEXT<img src="another.jpg"></p>'
>>> soup = BeautifulSoup(html)
>>> for m in soup.findAll(['a', 'img']):
... if m.parent.name == 'p':
... m.replaceWith('')
>>> print soup
<p>TEXT MORE TEXT</p>
Note: This will replace all
<a>, </a>
and<img>
elements (including content) that are inside of a<p>
element leaving the rest untouched. If you have BS4, usefind_all()
andreplace_with()
关于Python删除源中的某些元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20843434/