2017-03-05 21 views
0

私はいくつかのWebサイトのテーブルから取得したアイテムのリストを持っています。これをJSONに変換しました。私のアプローチは、次のとおりです。リストをPythonのJSON配列に変換する

r = requests.get("some_url") 
soup = BeautifulSoup(r.content, "html.parser") 
data = [] 

names = soup.find_all("keyword") 
for name in names: 
    data.append(name.text) 

table = soup.find_all("td") 
for item in table: 
    item_text = item.text.strip() 
    data.append(item_text) 

with io.open('data.json', 'w', encoding='utf8') as outfile: 
    json.dump(data, outfile, ensure_ascii=False) 

これは私にこのような出力が得られた:私はこのような何かにそれを変換したい

 
["name", 
    "component1", 
    "unit value", 
    "x", 
    "y", 
    "z", 
    "component1", 
    "unit value", 
    "x2", 
    "y2", 
    "z2", 
    "component2", 
    "unit value", 
    "x3", 
    "y3", 
    "z3", 

    ... 

を:

{ 
    "table": { 
     "id":"1", 
     "title": "name", 
     "component1": [ 
      { 
      "unit":"unit value", 
      "x value":"x", 
      "y value":"y", 
      "z value":"z" 
      }, 
      { 
      "unit":"unit value", 
      "x value":"x", 
      "y value":"y", 
      "z value":"z" 
      } 
     ], 
     "component2":[ 
      { 
      "unit":"unit value", 
      "x value":"x", 
      "y value":"y", 
      "z value":"z" 
      } 
     ] 

     ... 

    } 
} 

どのように私は私のJSON出力をフォーマットすることができますこのような?

htmlファイル:

<table id="table"> 
    <tr> 
     <th>component</th> 
     <th>unit</th> 
     <th>x value</th> 
     <th>y value</th> 
     <th>z value</th> 
    </tr> 
    <tr> 
     <td ><a href="#"> 
component1 

</a>&nbsp;</td> 
    <td class="right ">unit</td> 
    <td class="right "><nobr>x&nbsp;</nobr></td> 
    <td class="right "><nobr>y&nbsp;</nobr></td> 
    <td class="right "><nobr>z&nbsp;</nobr></td> 
    </tr> 
    <tr> 
     <td class="alt"><a href="/#"> 
component1 

</a>&nbsp;</td> 
     <td class="right alt">unit</td> 
     <td class="right alt"><nobr>x2&nbsp;</nobr></td> 
     <td class="right alt"><nobr>y2&nbsp;</nobr></td> 
     <td class="right alt"><nobr>z2&nbsp;</nobr></td> 
    </tr> 
    <tr> 
     <td ><a href="#"> 
component2 

</a>&nbsp;</td> 
     <td class="right ">unit</td> 
     <td class="right "><nobr>x3&nbsp;</nobr></td> 
     <td class="right "><nobr>y3&nbsp;</nobr></td> 
     <td class="right "><nobr>z3&nbsp;</nobr></td> 
    </tr> 
    ... 
+5

はどのようにあなたがそのようなPythonの辞書を構築するでしょう... JSONを忘れましたか?あなたが持っているのはリスト –

+0

@ cricket_007なので、この種のデータ構造を作る方法はないと言っていますか? – Spootrick

+0

@SpootrickあなたはあなたのHTMLテーブルをリストに変換するときに情報を失うことになります。その情報を失ってはいけません。それを利用して辞書を構築してください。あなたがhtmlテーブルを共有できるなら、私たちはあなたを助けることができるかもしれません。 –

答えて

-1
from bs4 import BeautifulSoup, Comment 

t = """<html><table id="table"> 
    <tr> 
     <th>component</th> 
     <th>unit</th> 
     <th>x value</th> 
     <th>y value</th> 
     <th>z value</th> 
    </tr> 
    <tr> 
     <td ><a href="#"> 
component1 

</a>&nbsp;</td> 
    <td class="right ">unit</td> 
    <td class="right "><nobr>x&nbsp;</nobr></td> 
    <td class="right "><nobr>y&nbsp;</nobr></td> 
    <td class="right "><nobr>z&nbsp;</nobr></td> 
    </tr> 
    <tr> 
     <td class="alt"><a href="/#"> 
component1 

</a>&nbsp;</td> 
     <td class="right alt">unit</td> 
     <td class="right alt"><nobr>x2&nbsp;</nobr></td> 
     <td class="right alt"><nobr>y2&nbsp;</nobr></td> 
     <td class="right alt"><nobr>z2&nbsp;</nobr></td> 
    </tr> 
    <tr> 
     <td ><a href="#"> 
component2 

</a>&nbsp;</td> 
     <td class="right ">g</td> 
     <td class="right "><nobr>x3&nbsp;</nobr></td> 
     <td class="right "><nobr>y3&nbsp;</nobr></td> 
     <td class="right "><nobr>z3&nbsp;</nobr></td> 
    </tr></<table></html>""" 

bs = BeautifulSoup(t) 

results = {} 
for row in bs.findAll('tr'): 
    # build the header 
    aux = row.findAll('th') 
    if aux: 
     keys = [val.text.strip() for val in aux] 
     continue 
    # for rows other than header 
    aux = row.findAll('td') 
    if aux: 
     # for each row build the dictionary equivalent 
     temp_res = {} 
     for idx, key in enumerate(keys): 
      if key == 'component': 
       component_name = aux[idx].text.strip() 
      temp_res[key] = aux[idx].text.strip() 

    # append the component value to result 
    if component_name in results: 
     results[component_name].append(temp_res) 
    else: 
     results[component_name] = [temp_res] 

# adjusting the result in the format you requested. adding id/title. 
import json 
results["id"] = "1" 
results["title"] = "name" 

main_result = {"table": results} 

json.dumps(main_result) 

出力:

{ 
    "table": { 
     "component2": [ 
      { 
       "component": "component2", 
       "z value": "z3", 
       "unit": "g", 
       "x value": "x3", 
       "y value": "y3" 
      } 
     ], 
     "id": "1", 
     "component1": [ 
      { 
       "component": "component1", 
       "z value": "z", 
       "unit": "unit", 
       "x value": "x", 
       "y value": "y" 
      }, 
      { 
       "component": "component1", 
       "z value": "z2", 
       "unit": "unit", 
       "x value": "x2", 
       "y value": "y2" 
      } 
     ], 
     "title": "name" 
    } 
} 
+0

これは私が欲しいものです。 – Spootrick

+0

@Spootrick:あなたは大歓迎です。まだ誰かがそれを投票しましたが、受け入れてくれてありがとう:) –

関連する問題