2014-12-26 32 views
0

我想完成关闭一些其他HTML中的图像标记,因为当我用JS创建它,然后发送给自己,它没有正确关闭。我为此使用Python。正则表达式将<div><img ...></div>转换为<div><img ... /></div>在Python中

鉴于此字符串:

<div><img src="/images/someImage.png" alt="Some Image"></div> 

我怎样才能得到

<div><img src="/images/someImage.png" alt="Some Image" /></div> 

这是我想出迄今:

re.sub("<img(.*)(?<!/)>", "<img\\1 />", x) 

而且只图像,它的工作原理,但一旦我加入div的包围它,它把它放在了错误的位置:

<div><img src="http://sh.local/images/tripAlbums/2014/thumbs/Background%20Default.jpeg"></div /> 

正如你会注意到,结尾的DIV有我想要的图像标签。

请注意,虽然我只显示一个图像,但可能还有更多,因此它应该与全局re.sub一起使用。

谢谢。

回答

2

使用非贪婪.*?

>>> re.sub("<img(.*?)(?<!/)>", "<img\\1 />", str) 
'<div><img src="/images/someImage.png" alt="Some Image" /></div>' 

OR

你也可以尝试

>>> re.sub("<img([^>]*)(?<!/)>", "<img\\1 />", str) 
'<div><img src="/images/someImage.png" alt="Some Image"/></div>' 
  • [^>]*否定字符类。匹配比>零个或多个倍以外的任何其他



清洁方法

的清洁器和美丽的方法将使用BeautifulSoup

>>> import bs4 
>>> str='<div><img src="/images/someImage.png" alt="Some Image"></div>' 
>>> soup = bs4.BeautifulSoup(str) 
>>> soup.prettify() 
u'<div>\n <img alt="Some Image" src="/images/someImage.png"/>\n</div>' 

注意正则表达式不是解析html的正确工具。推荐使用html解析器,如BeautifulSoup

+0

完美。 (没有线索谁只是downvoted你)。 – David

+0

@大卫很高兴听到它帮助:) – nu11p01n73R

+0

你能解释第二种方法吗?我从来没有看到过。我一定会看看美丽的汤。 – David

0
s='<div><img src="/images/someImage.png" alt="Some Image"></div>' 
n=s.find('<img') 
result=s[:n+1] 
s=s[n+2:] 
n=s.find('>') 
result=result+s[:n]+"/"+s[n:] 
print result 
+0

嗯,这是相当丑陋考虑到我需要的是另一个'?'。它也不使用正则表达式,这是个问题。看到正确的方式来做到这一点的其他答案。 – David

1

BeautifulSoup将为您自动完成这项工作。

>>> from bs4 import BeautifulSoup 
>>> s = '''<div><img src="/images/someImage.png" alt="Some Image"></div>''' 
>>> soup = BeautifulSoup(s) 
>>> soup 
<html><body><div><img alt="Some Image" src="/images/someImage.png"/></div></body></html> 
相关问题