2013-08-31 31 views
12

Próbuję przekonwertować tabelę wyodrębnioną przez BeautifulSoup na JSON.Konwertuj tabelę HTML na JSON

Do tej pory udało mi się wyizolować wszystkie wiersze, ale nie jestem pewien, jak pracować z danymi stąd. Każda rada byłaby bardzo doceniana.

[<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>] 

(Linia łamie kopalni dla czytelności)

To była moja próba:

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) 

który dał mi następujący wynik:

[ 
[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'] 
] 

Odpowiedz

19

Prawdopodobnie dane jest coś takiego jak :

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> 
""" 

z których możemy uzyskać wynik w postaci listy przy użyciu tego kodu:

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

Aby przekonwertować wynik JSON, jeśli nie dbają o porządek:

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

Result :

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

Jeśli potrzebujesz tej samej kolejności, użyj tego:

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

co daje:

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

Bardzo dziękuję, ja otrzymuję błąd co było spowodowane kodowania niektórych znaków w odpowiedzi serwera, gdy pomyślałem, że na odpowiedź działało idealnie. Jeszcze raz dziękuję i życzę udanego dnia. – declanjscott