2017-01-02 8 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.isoup可変内部最初<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

それは面白い面白いですが、私はそれを考えなかったでしょう、多くのおかげで宏杰李! –

関連する問題