2012-10-18 135 views
8

我正在使用BeautifulSoup进行一些HTML清理。 Noob到Python & BeautifulSoup。我有标签被删除正确如下,基于一个答案,我发现其他地方#2:使用BeautifulSoup删除所有内联样式

[s.extract() for s in soup('script')] 

但如何删除内嵌样式?例如以下:

<p class="author" id="author_id" name="author_name" style="color:red;">Text</p> 
<img class="some_image" href="somewhere.com"> 

应该改为:

<p>Text</p> 
<img href="somewhere.com"> 

如何删除内嵌类,ID,名称&样式的所有元素的属性?

我可以找到所有提到的使用CSS解析器来处理这个问题的解决方案,而不是BeautifulSoup的解决方案的答案,但由于该任务仅仅是删除而不是操作属性,并且是所有标签的总括规则,所以我希望找到一种在BeautifulSoup中完成这一切的方法。

回答

25

如果您只是想将其全部删除,则无需解析任何CSS。 BeautifulSoup提供了一种方法,以消除像这样整个属性:

for tag in soup(): 
    for attribute in ["class", "id", "name", "style"]: 
     del tag[attribute] 

另外,如果你只是想删除整个标签(和它们的内容),你不需要extract(),返回标签。你只需要decompose()

[tag.decompose() for tag in soup("script")] 

区别不是很大,只是别的东西,我发现,而在寻找的文档。您可以在BeautifulSoup documentation中找到更多有关API的详细信息,并附有许多示例。

+0

我正在使用extract()以防万一我决定在任何时候生成已删除代码的列表,但decompose()也适用于完全删除和销毁标记和内容。感谢属性删除代码片段,就像一个魅力! – Ila

+0

有道理。我将留下关于'decompose()'的注释给其他可能会偶然发现的人。 – jmk

7

我不会在BeautifulSoup中这样做 - 您将花费大量时间尝试,测试和解决边缘案例。

Bleach正好为您做到这一点。 http://pypi.python.org/pypi/bleach

如果您在BeautifulSoup中这样做,我建议您使用“白名单”的方法,如Bleach那样。确定哪些标签可能具有哪些属性,并剥离不匹配的每个标签/属性。

+0

很酷,我不知道漂白剂。我没有考虑用例,但如果目标是清理不可信的HTML,那么这绝对是一种更好的方法。你得到我的赞成! – jmk

+0

漂白剂非常棒。我很喜欢。 –

1

基于JMK的功能,我用这个功能到白名单中删除属性的基础:

在python2工作,BeautifulSoup3

def clean(tag,whitelist=[]): 
    tag.attrs = None 
    for e in tag.findAll(True): 
     for attribute in e.attrs: 
      if attribute[0] not in whitelist: 
       del e[attribute[0]] 
     #e.attrs = None  #delte all attributes 
    return tag 

#example to keep only title and href 
clean(soup,["title","href"]) 
+0

您不应该将可变结构作为默认函数参数值传递。正如所见[这里](http://effbot.org/zone/default-values.htm)。 –

0

这里是我的Python3和BeautifulSoup4解决方案:

​​

它支持应保留属性的白名单。 :)如果没有提供白名单,所有的属性都会被删除。

相关问题