2017-12-09 15 views
0

私は、PythonでBeautifulSoupを使って小さなスクリプトを書いて、下のスクリプト内の変数contentに格納されている要素のいくつかを解析しました。以前に作成した空の辞書に項目を追加することは望ましくありません。むしろ、私はその場でそれを解析したいと思います。しかし、私は試しましたが、達成できませんでした。どんな助けも高く評価されます。辞書として解析された項目を格納することができません

これは私の試みです:

from bs4 import BeautifulSoup 

content=""" 
<table class="data"> 
    <tbody> 
     <tr class="blue"> 
      <td>hot</td> 
      <td>cold</td> 
     </tr> 
     <tr> 
      <td>day</td> 
      <td>night</td> 
     </tr> 
    </tbody> 
</table> 
""" 
soup = BeautifulSoup(content,'lxml') 
for items in soup.select('tr'): 
    data = [item.text for item in items.select("td")] 
    dict_val = {data[0] : data[1]} 
    print(dict_val) 

私は出力を取得しています方法:

{'hot': 'cold'} 
{'day': 'night'} 

私は出力を持っていることを期待する方法:

{'hot': 'cold','day': 'night'} 
+0

ヒント: 'dict_val'は各繰り返しで作成された新しい辞書です。 –

答えて

2

あなたがすることができますforループ外の辞書を作成します。

soup = BeautifulSoup(content,'lxml') 
d = {} 
for items in soup.select('tr'): 
    data = [item.text for item in items.select("td")] 
    d[data[0]] = data[1] 
print(d) 

それとも、あなたは1行に辞書を作成することができます。

from bs4 import BeautifulSoup as soup 
s = [i.text for i in soup(content, 'lxml').findAll('td')] 
new_s = dict([s[i:i+2] for i in range(0, len(s), 2)]) 

出力:

{u'hot': u'cold', u'day': u'night'} 
+1

これは辞書の理解ではありません。 (0、len(s)、2)} ' –

+0

@PeterWoodは最近の私の編集を見てください。' {s [i]:s [i + 1] – Ajax1234

+0

最新バージョンを使用して動作することを確認しましたか? –

0

コンピュータにのみ、あなたがそれを教えて正確に何をすることを忘れないでください。元のコードには次の行があります。

dict_val = {data[0] : data[1]} 

これは、ループが繰り返されるたびに新しい辞書を作成します。代わりに、1つの辞書を作成して要素を追加する場合は、そのようにする必要があります。多くの場合、これはあなたが既にPythonに翻訳していることを意味します。

create a dictionary 
for each row in the table: 
    parse the <td> elements from the row 
    add an entry to the dictionary 

重要な違いは、辞書が作成される場所と、HTMLからのデータが辞書にどのように挿入されるかです。私はPythonでこれを行う方法の詳細を練習として残します。 (ヒント:他の答えを見てください)ここで重要なことは、実行したいステップの順番を明確に考えて、、次にをPythonで実行する方法を考え出すことです。

0

forループの前に辞書を初期化する必要があります。すべての繰り返しでコード内にこの行に新しい辞書が作成されますdict_val = {data[0] : data[1]}。次のコードを試すことができます:

from bs4 import BeautifulSoup 

content=""" 
<table class="data"> 
    <tbody> 
     <tr class="blue"> 
      <td>hot</td> 
      <td>cold</td> 
     </tr> 
     <tr> 
      <td>day</td> 
      <td>night</td> 
     </tr> 
    </tbody> 
</table> 
""" 
soup = BeautifulSoup(content,'lxml') 
dict_val = {} 
for items in soup.select('tr'): 
    data = [item.text for item in items.select("td")] 
    dict_val[data[0]] = data[1] 
print(dict_val) 
関連する問題