2017-01-22 72 views
1

我想从一个变量调用一个美丽的汤属性(例如class_,HREF,同上)用它在功能,如本中存储的变量的属性:调用和使用(使用Beautifulsoup 4)

脚本

from bs4 import BeautifulSoup 
data='<p class="story">xxx </p> <p id="2">yyy</p> <p class="story"> zzz</p>' 

def removeAttrib(data, **kwarg): 
    soup = BeautifulSoup(data, "html.parser") 
    for x in soup.findAll(tag, kwargs): 
     del x[???] # should be an equivalent of: del x["class"] 

kwargs= {"class":"story"} 
removeAttrib(data,"p",**kwargs) 
print(soup) 

预期的结果:

<p>xxx </p> <p id="2">yyy</p> <p> zzz</p> 

MYGz使用tag, argdict使用字典作为函数的参数解决了第一个问题。然后我在this question中发现了**kwargs(要传递字典的键值)。

但我没有找到del x["class"]的方式。 如何传递“class”键?我尝试使用ckey=kwargs.keys(),然后del x[ckey]但它没有奏效。

ps1:任何想法为什么removeAttrib(data,“p”,{“class”:“story”})不起作用? Ps2的:这是另外一个话题比this(这不是一式两份)

回答

1

所有功劳都MYGz和commandlineluser

from bs4 import BeautifulSoup 
data='<p class="story">xxx </p> <p id="2">yyy</p> <p class="story"> zzz</p>' 


def removeAttrib(data, tag, kwargs): 
    soup = BeautifulSoup(data, "html.parser") 
    for x in soup.findAll(tag, kwargs): 
     for key in kwargs: 
      # print(key) #>>class   
      x.attrs.pop(key, None) # attrs: to access the actual dict 
      #del x[key] would work also but will throw a KeyError if no key 

    print(soup)   
    return soup 

data=removeAttrib(data,"p",{"class":"story"}) 
1

可以传递,而不是一本字典:

from bs4 import BeautifulSoup 
data='<p class="story">xxx </p> <p id="2">yyy</p> <p class="story"> zzz</p>' 
soup = BeautifulSoup(data, "html.parser") 

def removeAttrib(soup, tag, argdict): 

    for x in soup.findAll(tag, argdict): 
     x.decompose() 

removeAttrib(soup, "p", {"class": "story"}) 
+0

这是不我正在寻找的答案是:它并没有告诉我如何在其他情况下调用属性 - 尽管我没有找到其他示例。但我非常感谢你为这个优雅的解决方案。我在文档中发现“您可以通过将标签视为字典来访问标签的属性”,另一种方式是使用attrs(或实际上是快捷方式的class_) – JinSnow

+0

我终于找到了例子寻找。在soup.findAll(tag,argdict)中为x:del x [* key]'请看我的问题编辑。 – JinSnow

+0

@Guillaume您没有提出完整的问题。我更新了答案。这就是你如何删除不需要的标签。 – MYGz