2013-08-31 144 views
12

我試圖將通過BeautifulSoup提取的錶轉換爲JSON。將HTML錶轉換爲JSON

到目前爲止,我已經設法隔離所有行,但我不知道如何處理來自這裏的數據。任何建議將非常感激。

[<tr><td><strong>Balance</strong></td><td><strong>$18.30</strong></td></tr>, 
<tr><td>Card name</td><td>Name</td></tr>, 
<tr><td>Account holder</td><td>NAME</td></tr>, 
<tr><td>Card number</td><td>1234</td></tr>, 
<tr><td>Status</td><td>Active</td></tr>] 

(換行符礦的可讀性)

這是我的嘗試:

result = [] 
allrows = table.tbody.findAll('tr') 
for row in allrows: 
    result.append([]) 
    allcols = row.findAll('td') 
    for col in allcols: 
     thestrings = [unicode(s) for s in col.findAll(text=True)] 
     thetext = ''.join(thestrings) 
     result[-1].append(thetext) 

這給了我下面的結果:

[ 
[u'Card balance', u'$18.30'], 
[u'Card name', u'NAMEn'], 
[u'Account holder', u'NAME'], 
[u'Card number', u'1234'], 
[u'Status', u'Active'] 
] 

回答

19

可能是你的數據是一樣的東西:

html_data = """ 
<table> 
    <tr> 
    <td>Card balance</td> 
    <td>$18.30</td> 
    </tr> 
    <tr> 
    <td>Card name</td> 
    <td>NAMEn</td> 
    </tr> 
    <tr> 
    <td>Account holder</td> 
    <td>NAME</td> 
    </tr> 
    <tr> 
    <td>Card number</td> 
    <td>1234</td> 
    </tr> 
    <tr> 
    <td>Status</td> 
    <td>Active</td> 
    </tr> 
</table> 
""" 

從中我們可以使用此代碼得到你的結果作爲一個列表:

from bs4 import BeautifulSoup 
table_data = [[cell.text for cell in row("td")] 
         for row in BeautifulSoup(html_data)("tr")] 

將結果轉換爲JSON,如果你不關心順序:

import json 
print json.dumps(dict(table_data)) 

結果:

{ 
    "Status": "Active", 
    "Card name": "NAMEn", 
    "Account holder": 
    "NAME", "Card number": "1234", 
    "Card balance": "$18.30" 
} 

如果您需要以相同的順序,使用此:

from collections import OrderedDict 
import json 
print json.dumps(OrderedDict(table_data)) 

它給你:

{ 
    "Card balance": "$18.30", 
    "Card name": "NAMEn", 
    "Account holder": "NAME", 
    "Card number": "1234", 
    "Status": "Active" 
} 
+0

非常感謝,我得到這是由於一些字符在服務器的響應的編碼,一旦我想通了這一點你的回答非常完美錯誤。再次感謝,祝你有美好的一天。 – declanjscott