2017-01-22 61 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