从内联样式中删除高度和宽度

时间:2017-02-27 20:31:40

标签: html beautifulsoup

我使用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的精神来自我的计算机并谋杀了我的第一个出生。

3 个答案:

答案 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()