Python re.sub 替换 html 属性

Posted

技术标签:

【中文标题】Python re.sub 替换 html 属性【英文标题】:Python re.sub replace html attributes 【发布时间】:2017-08-07 20:14:42 【问题描述】:

我正在尝试从 html 代码调整图像的大小。这是一个例子:

我的目标是用高度和宽度 400 替换 " height="108" " 和 " width="150"。 我尝试了以下几行,但它们似乎不起作用:

re.sub(r'','',x)
re.sub(r'','',x)

有人对此有解决方案吗? Ps:我不太擅长正则表达式... :)

【问题讨论】:

Nooo...不要使用正则表达式解析/修改 html/xml...使用 BeautifulSoup/XSLT/...等工具。 这并不能完全回答我的问题,虽然我会看看它:) Python 字符串是不可变的。子函数返回一个新字符串 正则表达式适用于这个特定的用例。 Re.sub not working for me的可能重复 【参考方案1】:

它不起作用的原因是因为字符串是不可变的,并且您不处理结果。您可以通过以下方式“解决”问题:

x = re.sub(r'','',x)
x = re.sub(r'','',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 的标记替换为height="400"。您可以通过例如只接受<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  >'
>>> import re
>>> y = re.sub(r'','',x)
>>> y
'<foo  >'

请注意,re.sub 不会改变 x:

>>> x
'<foo  >'
>>> y
'<foo  >'

也许你想这样做:

x = re.sub(r'','',x)
x = re.sub(r'','',x)

【讨论】:

顺便标记了一个重复项

以上是关于Python re.sub 替换 html 属性的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式re.sub替换不完整的问题现象及其根本原因

Python:re.sub()实现字符串替换

python re 与 re.sub替换部分文件

Python正则替换字符串函数re.sub用法示例

python字符串替换之re.sub()

python re.sub