2017-04-05 10 views
0

私は、.contentsはタグの直接の子を返します。子に反復したい場合は、.childrenを使うべきです。しかし、私は両方を試して、同じ出力を得ました。.contentsと.childrenの違い

html_doc = """ 
<html><head><title>The Dormouse's story</title></head> 
<body> 
<p class="title"><b>The Dormouse's story</b></p> 

<p class="story">Once upon a time there were three little sisters; and their names were 
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, 
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and 
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; 
and they lived at the bottom of a well.</p> 

<p class="story">...</p></body></html> 
""" 
soup = BeautifulSoup(html_doc, "html.parser") 
title_tag = soup.title 

for child in title_tag.children: 
    print(child) 
for child in title_tag.contents: 
    print(child) 
+0

'NameError:name 'title_tag' not not defined'が見つかりました。これを実際の例にするのはどうですか? – tdelaney

+0

申し訳ありません。さて、やった! – Hamza

答えて

0

ドキュメントはそれより少し微妙です。それは

Instead of getting them as a list, you can iterate over a tag’s children using the .children generator

言うしかし、あなたは、forループで直接リストを反復処理することができますし、iter()を呼び出すことにより、イテレータを取得することができますので、それも.children性質を持っているkindofが無意味と思われます。より詳しく見ると、childrenの実装方法は次のとおりです。

#Generator methods 
@property 
def children(self): 
    # return iter() to make the purpose of the method clear 
    return iter(self.contents) # XXX This seems to be untested. 

はい、全く無意味です。これらの2つのコード断片は、for child in title_tag.contentsがリストのイテレータを取得し、for child in title_tag.childrenが渡されたイテレータを使用する点を除き、同じです。 ...あなたはBeautifulSoup(あなたは私たちにいくつかの背景コンテンツを与える必要があります!)の話をしていることを

Asを考慮

0

.childrenとしながら、主な違いは、.contentsでリストを取得しますということで、here言いましたあなたはジェネレータを取得します。

両方を繰り返すことができるので、違いはないようですが、大きなデータセットで作業する場合は、常にコンピュータのメモリを節約するためにジェネレータを使用することをお勧めします。

画像:これは10kのテキストファイルで、各行を時間通りに処理する必要があります。リスト(例:with open('t.txt') as f: lines = f.readlines())を使って作業する場合、あなたはすぐには動作しないものであなたの記憶を一杯にします。スペースを費やすだけです(あなたの環境によっては、メモリが十分です...)ジェネレータを使って作業しているときには、必要に応じて、メモリ消費がなくなり、ラインが得られます。

関連する問題