2017-05-25 18 views
1

リストに関連付けられている後で結合するためのキー値を持つ辞書テーブルを作成しようとしています。以下はコードが出力する出力と目的の出力です。誰かがリスト形式の辞書で所望の出力を達成するのを助けてくれますか?注:2番目のセットにはリンクがありません。このようなときに "None"などの値をここに入れることができますか?リストがあるpython beautifulsoup辞書テーブル

import requests 
from bs4 import BeautifulSoup 
from collections import defaultdict 

html='<tr><td align="right">1</td><td align="left"><a href="http://www.tennisabstract.com/cgi-bin/wplayer.cgi?p=VictoriaAzarenka">Victoria Azarenka</a></td><td align="left">BLR</td><td align="left">1989-07-31</td></tr> <tr><td align="right">1146</td><td align="left">Brittany Lashway</td><td align="left">USA</td><td align="left">1994-04-06</td></tr>'

soup = BeautifulSoup(html,'lxml') 

for cell in soup.find_all('td'): 
    if cell.find('a', href=True): 
     print(cell.find('a', href=True).attrs['href']) 
     print(cell.find('a', href=True).text) 
    else: 
     print(cell.text) 

''' 
Output From Code: 
1 --> Rank 
http://www.tennisabstract.com/cgi-bin/wplayer.cgi?p=VictoriaAzarenka --> Website 
Victoria Azarenka --> Name 
BLR --> Country 
1989-07-31 --> Birth Date 
1146 --> Rank 
Brittany Lashway --> Name 
USA --> Country 
1994-04-06 --> Birth Date 

Desired Output: (Dictionary Table with List component) 

{Key, [Rank, Website,Name, Country, Birth Date]} 
Example: 
{1, [1, http://www.tennisabstract.com/cgi-bin/wplayer.cgi?p=VictoriaAzarenka, Victoria Azarenka, BLR, 1989-07-31]} 
{2, [1146, None, Brittany Lashway, USA, 1994-04-06]} 
''' 

答えて

1

あなたはlist and dict comprehensionを使用して、このような何かを行うことができます。

from bs4 import BeautifulSoup as bs 

html='<tr><td align="right">1</td><td align="left"><a href="http://www.tennisabstract.com/cgi-bin/wplayer.cgi?p=VictoriaAzarenka">Victoria Azarenka</a></td><td align="left">BLR</td><td align="left">1989-07-31</td></tr> <tr><td align="right">1146</td><td align="left">Brittany Lashway</td><td align="left">USA</td><td align="left">1994-04-06</td></tr>' 

# Genrator to find the desired text and links 
def find_link_or_text(a): 
    for cell in a: 
     if cell.find('a', href=True): 
      yield cell.find('a', href=True).attrs['href'] 
      yield cell.find('a', href=True).text 
     else: 
      yield cell.text 

# Parse data using BeautifulSoup 
data = bs(html, 'lxml') 
# Retrurn only a parsed data within td tag 
parsed = data.find_all('td') 

# Group elements by 5 
sub = [list(find_link_or_text(parsed[k:k+4])) for k in range(0, len(parsed), 4)] 

# put the sub dict within a key from 1 to len(sub)+1 
final = {key: value for key, value in zip(range(1, len(sub) +1), sub)} 
print(final) 

出力:

{1: ['1', 'http://www.tennisabstract.com/cgi-bin/wplayer.cgi?p=VictoriaAzarenka', 'Victoria Azarenka', 'BLR', '1989-07-31'], 2: ['1146', 'Brittany Lashway', 'USA', '1994-04-06']} 
関連する問題