2015-07-22 3 views
0

Я сбрасываю данные из нескольких таблиц URL. Мой код позволяет мне получить такую ​​CSV (с помощью запятой, как кома ... ЕВРОПА)Как создать такой словарь?

a;1 -------- 1st URL 
b;2 
c;3 
d;4 
e;5 
a;7 ---------- 2nd URL 
b;3 
c;5 
d;8 
e;9 
a;9 ---------- 3rd URL 
b;3 
y;5 

The --- URL не являются частью CSV. Это просто показать вам, где данные для URL1 начинаются, и так далее.
Я никогда не знаю заранее, сколько полей будет содержать URL, и какие поля он собирается содержать. Я хочу, чтобы добраться до CSV хорошо организованной глядя, как это (на примере):

Name ; 1stUrl ;2ndURl ;3rd Url 
a;1;7;9 
b;2;3;3 
c;3;5;ø 
d;4;8;ø 
e;5;9;ø 
y;ø;ø;5 

Я не очень волнует порядка а, б, в, г. Поля могут быть в ordre, которые они предпочитают больше всего.

У меня есть две проблемы: - когда код встречает новое поле, он должен добавить его в список полей (пример поля «y»). - код должен оставить пустое место в вакууме; ø; когда в URL-адресе для этого поля нет ключа.

Я пробовал что-то плохое, но это явно не так. Даже концептуально, меня там нет.

from collections import * 
import csv 

def parse_csv(content, delimiter = ';'): 
    csv_data = [] 
    for line in content.split('\n'): 
    csv_data.append([x.strip() for x in line.split(delimiter)]) # strips spaces also 
    return csv_data 


s =parse_csv(open('raw.csv','rU', encoding='utf8').read()) 
print(len(s)) 
dic = defaultdict(list) 
for n in range(0,len(s)): 
    if (len(s[n]) == 2): 
     key = s[n][0] 
     val = s[n][1] 
     print(key) 
     print(val) 


writer = csv.writer(open('dict.csv', 'w',encoding='utf8'), delimiter=';') 
for key, value in dico.items(): 
    writer.writerow([key, value]) 

Что вы думаете об этом?
Любая помощь будет оценена ребятами :)!

ответ

0
from bs4 import BeautifulSoup 
import csv 
import urllib.request 
from collections import * 


def parse_csv(content, delimiter = ';'): ##We use here ";" to parse CSV because of the European way of dealing with excel-csv 
    csv_data = [] 
    for line in content.split('\n'): 
    csv_data.append([x.strip() for x in line.split(delimiter)]) # strips spaces also 
    return csv_data 

List_of_list_of_pairs=[] 
List_of_pairs=[] 

list_url=parse_csv(open('url.csv','rU').read()) 


for i in range(0,len(list_url)) : 
    List_of_pairs = [] 

    url=str(list_url[i][0]) ## read URL from an array coming from an Url-CSV 
    page=urllib.request.urlopen(url) 
    soup_0 = BeautifulSoup(page.read(),"html.parser") 
    restricted_webpage= soup_0.find("div", {"id":"ingredients"}) 
    readable_restricted=str(restricted_webpage) 
    soup=BeautifulSoup(readable_restricted,"html.parser") 


    trs = soup.find_all('tr') 

    for tr in trs: 
     tds = tr.find_all("td") 

     try: #we are using "try" because the table is not well formatted. This allows the program to continue after encountering an error. 
      Nutriments = str(tds[0].get_text().strip()) 
      print(Nutriments) 
     # This structure $isolate the item by its column in the table and converts it into a string. 
      Quantity = str(tds[1].get_text().strip()) 
      print(Quantity) 
      Pair=[Nutriments,Quantity] 
      List_of_pairs.append(Pair) 

     except: 
      print ("bad tr string") 
      continue #This tells the computer to move on to the next item after it encounters an error 
    List_of_list_of_pairs.append(List_of_pairs) 

print(List_of_list_of_pairs) 
dico = defaultdict(list) 

for n,list_of_pairs in enumerate(List_of_list_of_pairs): 
    for i,pairs in enumerate(list_of_pairs): 
     if (len(pairs) == 2): 
      cle = pairs[0] 
      val = pairs[1] 
      while (len(dico[cle]) < n): 
        dico[cle].append('ND') 
      dico[cle].append(val) 
for cle in dico: 
    while (len(dico[cle]) < n): 
      dico[cle].append('ND') 


import csv 
with open("dict2csv.csv", 'w',encoding='utf8') as outfile: 
    csv_writer = csv.writer(outfile, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL,) 

    for k,v in dico.items(): 
     csv_writer.writerow([k] + v) 
0

В качестве значения для dict вы можете указать list объектов. Так же просто, как:

content = """a;1 
b;2 
c;3 
d;4 
e;5 
a;7 
b;3 
c;5 
d;8 
e;9 
a;9 
b;3 
y;5""" 

csv_data = [] 
for line in content.split('\n'): 
    csv_data.append([x.strip() for x in line.split(';')]) 

s = csv_data 
dic = {} 
for n in range(0,len(s)): 
    if (len(s[n]) == 2): 
     key = s[n][0] 
     val = s[n][1] 
     if key not in dic: 
      dic[key] = [] 
     dic[key].append(val) 

А теперь dic является:

{'a': ['1', '7', '9'], 
'b': ['2', '3', '3'], 
'c': ['3', '5'], 
'd': ['4', '8'], 
'e': ['5', '9'], 
'y': ['5']} 

Что, что вы хотели, я думаю.

На стороне примечания, я бы настоятельно советовал вам никогда не использовать from package_xx import *, потому что он может загромождать окружающую среду.

+0

Благодарим за предоставленный вам четкий ответ. Но я не уверен, что работает именно так, как я хочу, чтобы он работал. Я был не очень ясен, и я сожалею об этом. Действительно, в вашем окончательном dic у нас нет информации, кроме как в поле «y», 5 поступает из третьего URL-адреса. Действительно, он помещается в первую позицию, справа внизу, a1, которые образуют первый URL-адрес. – BoobaGump

+0

хорошо и откуда вы знаете, когда URL-адрес завершен? Есть ли как «код остановки», чтобы узнать, что один URL-адрес завершен, а другой начинается? – Challensois

+0

Нет. Нет. Теперь список списков пар, который позволяет мне знать, когда URL-адрес останавливается. Он работает сейчас. Я обновлю рабочий ответ. – BoobaGump

Смежные вопросы