2017-03-16 190 views
3

我正在尝试从html代码调整图片大小。这是一个例子:Python re.sub替换html属性

我的目标是替代" height="108"“和" width="150"用高度和宽度400 我已经试过以下行,但他们似乎没有工作: ?

re.sub(r'width="[0-9]{2,4}"','width="400"',x) 
re.sub(r'height="[0-9]{2,4}"','height="400"',x) 

有没有人有一个解决方案 PS:我没那么擅长的正则表达式... :)

+0

拿去......不解析/修改HTML/XML与正则表达式...等工具BeautifulSoup/XSLT/.. –

+0

这并不完全回答我的问题,虽然我会看看它:) – Tastro

+3

Python字符串是不可变的。子函数返回一个新的字符串 –

回答

4

它没有理由工作是,因为字符串是不可变的,并且您不处理结果。你可以在“解决”这个问题:

x =re.sub(r'width="[0-9]{2,4}"','width="400"',x) 
x =re.sub(r'height="[0-9]{2,4}"','height="400"',x)

话虽这么说这是一个非常糟糕的主意,以处理与正则表达式 HTML/XML。假设你有一个标签<foo altwidth="1234">。现在你会改变它为<foo altwidth="400">你想要吗?可能不会。

可以例如使用BeautifulSoup

soup = BeautifulSoup(x,'lxml') 

for tag in soup.findAll(attrs={"width":True}) 
    tag.width = 400 
for tag in soup.findAll(attrs={"height":True}) 
    tag.height = 400 
x = str(soup) 

在这里,我们代替所有标签与width属性width="400"并与height="400"一个height所有标签。你可以把它多由例如只接受<img>标签先进,如:

soup = BeautifulSoup(x,'lxml') 

for tag in soup.findAll('img',attrs={"width":True}) 
    tag.width = 400 
for tag in soup.findAll('img',attrs={"height":True}) 
    tag.height = 400 
x = str(soup)
2

看起来完全正常工作:

>>> x = '<foo width="150" height="108">' 
>>> import re 
>>> y = re.sub(r'width="[0-9]{2,4}"','width="400"',x) 
>>> y 
'<foo width="400" height="108">' 

注意re.sub不发生变异X:

>>> x 
'<foo width="150" height="108">' 
>>> y 
'<foo width="400" height="108">' 

也许你想这样做,而不是:

x = re.sub(r'width="[0-9]{2,4}"','width="400"',x) 
x = re.sub(r'height="[0-9]{2,4}"','height="400"',x) 
+0

标记重复,顺便说一句 –