我使用BeautifulSoup从元素中删除内联高度和宽度。解决图像很简单:
def remove_dimension_tags(tag):
for attribute in ["width", "height"]:
del tag[attribute]
return tag
但我不确定如何处理这样的事情:
<div id="attachment_9565" class="wp-caption aligncenter" style="width: 2010px;background-color:red">
当我想要保留背景颜色(例如)或高度或宽度以外的任何其他样式属性时。
我能想到的唯一方法是使用正则表达式,但上次我提出类似的事情,StackOverflow的精神来自我的计算机并谋杀了我的第一个出生。
答案 0 :(得分:1)
如果需要,可以使用正则表达式,但有一种更简单的方法。
使用cssutils
进行更简单的css解析
一个简单的例子:
from bs4 import BeautifulSoup
import cssutils
s = '<div id="attachment_9565" class="wp-caption aligncenter" style="width: 2010px;background-color:red">'
soup = BeautifulSoup(s, "html.parser")
div = soup.find("div")
div_style = cssutils.parseStyle(div["style"])
del div_style["width"]
div["style"] = div_style.cssText
print (div)
输出:
>>><div class="wp-caption aligncenter" id="attachment_9565" style="background-color: red"></div>
答案 1 :(得分:1)
完整的演练将是:
from bs4 import BeautifulSoup
import re
string = """
<div id="attachment_9565" class="wp-caption aligncenter" style="width: 2010px;background-color:red">
<p>Some line here</p>
<hr/>
<p>Some other beautiful text over here</p>
</div>
"""
# look for width or height, followed by not a ;
rx = re.compile(r'(?:width|height):[^;]+;?')
soup = BeautifulSoup(string, "html5lib")
for div in soup.findAll('div'):
div['style'] = rx.sub("", string)
正如其他人所说,在实际值上使用正则表达式不是问题。
答案 2 :(得分:-1)
import bs4
html = '''<div id="attachment_9565" class="wp-caption aligncenter" style="width: 2010px;background-color:red">'''
soup = bs4.BeautifulSoup(html, 'lxml')
标签的属性是一个dict对象,你可以像dict一样修改它:
获取项目:
soup.div.attrs
{'class': ['wp-caption', 'aligncenter'],
'id': 'attachment_9565',
'style': 'width: 2010px;background-color:red'}
设置项目:
soup.div.attrs['style'] = soup.div.attrs['style'].split(';')[-1]
{'class': ['wp-caption', 'aligncenter'],
'id': 'attachment_9565',
'style': 'background-color:red'}
使用正则表达式:
soup.div.attrs['style'] = re.search(r'background-color:\w+', soup.div.attrs['style']).group()