2017-02-24 6 views
0

私はbeautifulsoupとpythonを初めて使っています。これは死んでいる単純な問題だと私は確信していますが、どこでも解決できないようです。python beautifulsoupセクションごとのループテーブル

私はキャンディーのタイプ別にテーブルをグループ化する "ヘッダー"行に基づいて、htmlテーブルの行をループしています。私のテーブルは次のようになります: enter image description here

それぞれのキャンディー見出しの下に日付を取得します。

最初のループの反復: candy_type:キットカット、 場所:モール1、 計画:63、 実際:0、 差分:25

第ので、反復は、このようなデータを取得することになります反復: candy_type:キットカット、 場所:モール2、 計画:7、 実際:0、 差分:6

...最後の反復: candy_type:スキットルズ、 場所:320、 実績:236、 差分:2、 計画の構築が

<TABLE BORDER="1" WIDTH="100%"> 
    <TR> 
     <TH COLSPAN=4>Candy</TH> 
    </TR> 
    <TR BGCOLOR=#CEE3F6> 
     <TD COLSPAN=4> 
     <FONT FACE=Arial> 
      <center><b>KitKat</b></center> 
     </FONT> 
     </TD> 
    </TR> 
    <TR BGCOLOR=#336699> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>LOCATION</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>PLANNED</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>ACTUAL</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>DIFF</FONT></TD> 
    </TR> 
    <TR> 
     <TD>Mall 1</TD> 
     <TD>63</TD> 
     <TD>0</TD> 
     <TD>25</TD> 
    </TR> 
    <TR> 
     <TD>Mall 2</TD> 
     <TD>7</TD> 
     <TD>0</TD> 
     <TD>6</TD> 
    </TR> 
    <TR BGCOLOR=#CEE3F6> 
     <TD COLSPAN=4> 
     <FONT FACE=Arial> 
      <center><b>OH Henry</b></center> 
     </FONT> 
     </TD> 
    </TR> 
    <TR BGCOLOR=#336699> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>LOCATION</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>PLANNED</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>ACTUAL</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>DIFF</FONT></TD> 
    </TR> 
    <TR> 
     <TD>Warehouse 1</TD> 
     <TD>195</TD> 
     <TD>122</TD> 
     <TD>30</TD> 
    </TR> 
    <TR> 
     <TD>Warehouse 2</TD> 
     <TD>96</TD> 
     <TD>76</TD> 
     <TD>6</TD> 
    </TR> 
    <TR BGCOLOR=#CEE3F6> 
     <TD COLSPAN=4> 
     <FONT FACE=Arial> 
      <center><b>Skittles</b></center> 
     </FONT> 
     </TD> 
    </TR> 
    <TR BGCOLOR=#336699> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>LOCATION</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>PLANNED</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>ACTUAL</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>DIFF</FONT></TD> 
    </TR> 
    <TR> 
     <TD>Building 1</TD> 
     <TD>120</TD> 
     <TD>90</TD> 
     <TD>5</TD> 
    </TR> 
    <TR> 
     <TD>Building 2</TD> 
     <TD>320</TD> 
     <TD>236</TD> 
     <TD>0</TD> 
    </TR> 
</TABLE> 
:0

これは、テーブル・コードであります

はので、私は、これは、このように3つのお菓子の種類を出力

from bs4 import BeautifulSoup 
import urllib 

readUrl = urllib.urlopen('test.html').read() 
soup = BeautifulSoup(readUrl) 
candytype = soup.findAll('tr',{"bgcolor" : "#CEE3F6"}) 
for type in candytype: 
    print type 

を試してみました:

<tr bgcolor="#CEE3F6"> 
<td colspan="4"> 
<font face="Arial"> 
</font><center><b>KitKat</b></center> 
</td> 
</tr> 
<tr bgcolor="#CEE3F6"> 
<td colspan="4"> 
<font face="Arial"> 
</font><center><b>OH Henry</b></center> 
</td> 
</tr> 
<tr bgcolor="#CEE3F6"> 
<td colspan="4"> 
<font face="Arial"> 
</font><center><b>Skittles</b></center> 
</td> 
</tr> 

私はキャンディーを「ヘッダー」(つまり、 tr要素でbgcolor#CEE3F6に設定されています)、それに基づいて繰り返されますが、それ以上のデータを取得する方法はわかりません。

アイデア?

+0

あなたは 'beautifulsoup'を使用する必要がありますか? ['parsel'](https://github.com/scrapy/parsel)を使うことをお勧めします。 – eLRuLL

答えて

2

すべての行を検索してから繰り返します。キャンデーの名前が入っているキャンバスを(行の色で)見つけたら、その名前を付けてください。今度は、その行の次の兄弟を特定します。最初のものをスキップすると、見出しになりますが、その後のテキストはtd要素から取り込まれます。あなたは別のキャンディーの名前に(再び行の色によって)遭遇したときに最後の兄弟を見つけたことを知っています。

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(open('justTable.htm').read(), 'lxml') 
>>> trs = soup.findAll('tr') 
>>> for tr in trs: 
...  if 'bgcolor' in tr.attrs and tr.attrs['bgcolor']=='#CEE3F6': 
...   candy = tr.text.strip() 
...   first = True 
...   for sibs in tr.fetchNextSiblings(): 
...    if first: 
...     first = False 
...     continue 
...    if 'bgcolor' in sibs.attrs and sibs.attrs['bgcolor']=='#CEE3F6': 
...     break 
...    [candy]+sibs.text.strip().split('\n') 
... 
['KitKat', 'Mall 1', '63', '0', '25'] 
['KitKat', 'Mall 2', '7', '0', '6'] 
['OH Henry', 'Warehouse 1', '195', '122', '30'] 
['OH Henry', 'Warehouse 2', '96', '76', '6'] 
['Skittles', 'Building 1', '120', '90', '5'] 
['Skittles', 'Building 2', '320', '236', '0'] 
関連する問題