2017-01-02 30 views
1

我怎樣才能把這個for循環放入定義中?beautifulsoup4:將for循環展開標籤放入定義(python3)

from bs4 import BeautifulSoup 
html="<p>ABC <i>Italic1 </i><i>Italic2</i></p>" 
soup = BeautifulSoup(html,"html.parser") 

for i in soup.findAll('i'): 
     soup.i.unwrap() 
print(soup) 

我做了嘗試,但沒有成功:

def UnwrapTag(x): 
    x=str(x) 
    for x in soup.findAll(x): 
      soup.x.unwrap() #wrong but what else? 

UnwrapTag('i')  
+0

'i'和'x'是循環變量,而不是'soup.i'或'soup.x'。 – poke

+1

@按照預期完成第一個塊的工作('i'是'bs4.element.Tag',並且被引用到'soup',所以即使不需要也可以做'soup.i') – Dekel

+0

@Dekel It雖然有一個非常不同的含義。在那裏使用'soup.i',這是錯誤的。 – poke

回答

2

嗯,其實你不應該使用soup.i這裏。

soup.i表示soup變量內部的第一個<i>元素。

只因爲你使用了相同的名稱 - 它工作。你實際想要使用的是i變量(而不是soup.i)。

from bs4 import BeautifulSoup 
html="<p>ABC <i>Italic1 </i><i>Italic2</i></p>" 
soup = BeautifulSoup(html,"html.parser") 

for i in soup.findAll('i'): 
     i.unwrap() 
print(soup) 

同樣在這裏:

def UnwrapTag(x): 
    x=str(x) 
    for x in soup.findAll(x): 
     x.unwrap() 

UnwrapTag('i') 
+0

非常感謝您的解釋!我明白我的錯誤(以及其他許多人)! –

2

要回答的問題有什麼不好?我認爲你正在使用它作爲迭代並作爲參數VAR混淆x,這段代碼的一切,原來的代碼運行:

from bs4 import BeautifulSoup 
html="<p>ABC <i>Italic1 </i><i>Italic2</i></p>" 
soup = BeautifulSoup(html,"html.parser") 

def UnwrapTag(x): 
    #x=str(x) # no need to do this 
    for k in soup.findAll(x): # using k instead of x to catch values 
     k.unwrap() 
    print(soup) 

UnwrapTag('i') 
1
def UnwrapTag(soup, target): 
    for x in soup.findAll(target): 
     print(x.text) 

測試:

from bs4 import BeautifulSoup 
html="<p>ABC <i>Italic1 </i><i>Italic2</i></p>" 
soup = BeautifulSoup(html,"html.parser") 
UnwrapTag(soup, 'i') 

out:

Italic1 
Italic2 
+0

這是超級有趣的,我不會想到這一點,非常感謝宏傑李! –