2017-02-27 4 views
1

Ich benutze BeautifulSoup, um Inline-Höhen und -Breiten von meinen Elementen zu entfernen. es für Bilder zu lösen war einfach:Höhe und Breite von Inline-Stilen entfernen

def remove_dimension_tags(tag): 
    for attribute in ["width", "height"]: 
     del tag[attribute] 
    return tag 

Aber ich bin nicht sicher, wie die Verarbeitung, so etwas zu gehen:

<div id="attachment_9565" class="wp-caption aligncenter" style="width: 2010px;background-color:red"> 

wenn ich möchte die Hintergrundfarbe (zum Beispiel) verlassen oder andere Stilattribute außer Höhe oder Breite.

Der einzige Weg, wie ich es tun kann, ist mit einer Regex, aber das letzte Mal, als ich etwas vorgeschlagen habe, kam der Geist von StackOverflow aus meinem Computer und ermordete meinen Erstgeborenen.

+0

Und wenn ich _am_ eine Regex verwenden soll ... würde eine kleine Hilfe damit sehr geschätzt werden. – thumbtackthief

+0

Ich sehe kein Problem mit der Verwendung von Regex _auf dem Inhalt des Stilattributs_, aber finde dieses Attribut mit BeautifulSoup. – Ben

Antwort

1

Eine vollständige Freilos wäre:

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) 

Wie von anderen angegeben, ist die Verwendung von regulären Ausdrücken auf den tatsächlichen Wert kein Problem.

1

Sie könnten Regex verwenden, wenn Sie möchten, aber es gibt einen einfacheren Weg.

Verwenden cssutils für ein einfacheres css

Ein einfaches Beispiel Parsen:

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) 

Ausgänge:

>>><div class="wp-caption aligncenter" id="attachment_9565" style="background-color: red"></div> 
-1
import bs4 

html = '''<div id="attachment_9565" class="wp-caption aligncenter" style="width: 2010px;background-color:red">''' 

soup = bs4.BeautifulSoup(html, 'lxml') 

Tag des Attributs ist ein dict Objekt, können Sie es wie ein dict ändern können:

get Artikel:

soup.div.attrs 

{'class': ['wp-caption', 'aligncenter'], 
'id': 'attachment_9565', 
'style': 'width: 2010px;background-color:red'} 

Set Artikel:

soup.div.attrs['style'] = soup.div.attrs['style'].split(';')[-1] 

{'class': ['wp-caption', 'aligncenter'], 
'id': 'attachment_9565', 
'style': 'background-color:red'} 

Verwendung Regex:

soup.div.attrs['style'] = re.search(r'background-color:\w+', soup.div.attrs['style']).group() 
+0

Das funktioniert nur, wenn ich die Reihenfolge der Attribute kenne und wie viele. – thumbtackthief

+0

Auch wenn Höhe und Breite mit einer beliebigen Anzahl von Elementen in beliebiger Reihenfolge durchsetzt sind, würde dies nicht funktionieren. – thumbtackthief

+0

@thumbtackthief post html code und ich werde es testen –