Я возвращаю более десятка типов элементов Scrapy, очищаю и храню их все в отдельных таблицах в SQL. Я мог бы написать инструкции для каждого элемента, но, похоже, лучше управлять программным обеспечением различных списков / таблиц данных / таблиц.

  • К сожалению, когда я пытаюсь вызвать элемент scrapy посредством ссылки на запись в dict, Python читает это как строку, а не как тип или класс.
  • Точно так же, когда я пытаюсь сослаться на имя списка - Python по-прежнему видит строку, которая не позволяет мне использовать .append ().

Будем весьма благодарны за любую помощь в получении Python для чтения строки как ссылки на класс или списка.

Вот версия моего кода:

from scrapy import signals
from dealinfo.items import List, Details, Rd, Status, CompletedDetails, Syndicate
from dealinfo.items import CompanyDetails, CompanyContactInfo, CompanyTeam, Compadvisors, CompanyPInvestors
from dealinfo.items import CompanyExecSum, CurrentRd, PastRd, AnnFin#, CompanyDocs

import pandas as pd
from sqlalchemy import create_engine

class SQLPipeline(object):
    engine=create_engine('mssql+pyodbc://username:password@database')

    #### matrix of table names by type ######
    prep = {'item_names': ['List', 'Details', 'Rd', 'Fin', 'Status', 'CompletedDetails', 'Syndicate', 'CompanyDetails', 'CompanyContactInfo', 'CompanyTeam', 'Compadvisors', 'CompanyPInvestors', 'CompanyExecSum', 'CompanyCurrentRd', 'CompanyPastRd', 'CompannFin', 'CompanyDocs'],
            'temp_table': ['items_dl', 'items_dd', 'items_dr', 'items_df', 'items_nds', 'items_ncd', 'items_ns', 'items_cd', 'items_cci', 'items_ct', 'items_ca', 'items_cpi', 'items_es', 'items_cr', 'items_pr', 'items_af', 'items_cdoc'],            
            'data_frame': ['dl', 'dd', 'dr', 'df', 'nds', 'ncd', 'ns', 'cd', 'cci', 'ct', 'ca', 'cpi', 'es', 'cr', 'pr', 'af', 'cdoc'],
            'sql_table': ['list', 'details', 'rd', 'fin', 'status', 'completed_details', 'syndicate', 'company_details', 'company_contact_info', 'company_team', 'company_advisors', 'company_pinvestors', 'company_execsum', 'company_current_rd', 'company_past_rd', 'company_ann_fin', 'company_docs']
            }

    #### assigning temporary lists for capturing parsed items ######
    for x in prep['temp_table']:
        globals()[x] = []

    #### create sql schema to receive final output ######
    def __init__(self):
        try: ## Check schema exists, create if not
            SQLPipeline.engine.execute("create schema dealinfo")
        except:
            pass   

    #### clean each scrapy item and add contents to temporary list (ahead of conversion to dataframe) ######
    def process_item(self, item, spider):
        for i in range(len(SQLPipeline.prep['item_names'])):
            if isinstance(item, SQLPipeline.prep['item_names'][i]):####<<---error - not able to call item using string
                for key,value in item.items(): 
                    if isinstance(item[key], list):
                        item[key] = [x.strip() for x in item[key] if x]
                        item[key] = [x for x in item[key] if x]
                        item[key] = ', '.join(item[key])
                SQLPipeline.prep['temp_table'][i].append(item.copy())####<<---error - not able to call item using string

    #### convert parsed items to pandas dataframe before sending to sql as tables ######     
    def close_spider(self, spider):
        for i in SQLPipeline.prep['item_names']:
            try:
                SQLPipeline.prep['data_frame'][i] = pd.DataFrame(SQLPipeline.prep['temp_table'][i])
                print(SQLPipeline.prep['data_frame'][i])
                SQLPipeline.prep['data_frame'][i].to_sql(SQLPipeline.prep['sql_table'][i], SQLPipeline.engine, schema='dealinfo', if_exists='replace', index=False)
            except Exception as ex:
                print(ex)
                pass
1
James Reade 28 Авг 2017 в 22:20

3 ответа

Лучший ответ

У juanpa.arrivillaga был правильный ответ для моей ситуации - все исправили - все работает сейчас. Я объявил список списков вверху, а затем добавил списки и элементы в свой словарь. Больше ничего не нужно!

    for x in ['items_dl','items_dd','items_dr','items_df','items_nds','items_ncd','items_ns','items_cd','items_cci','items_ct','items_ca','items_cpi','items_es','items_cr','items_pr','items_af','items_cdoc']:
    globals()[x] = []
    prep = {'temp_table': [items_dl, items_dd, items_dr, items_df, items_nds, items_ncd, items_ns, items_cd, items_cci, items_ct, items_ca, items_cpi, items_es, items_cr, items_pr, items_af, items_cdoc],
        'item_names': [List, Details, Rd, Status, CompletedDetails, Syndicate, CompanyDetails, CompanyContactInfo, CompanyTeam, Compadvisors, CompanyPInvestors, CompanyExecSum, CompanyCurrentRd, CompanyPastRd, CompannFin, CompanyDocs],
        'data_frame': ['dl', 'dd', 'dr', 'df', 'nds', 'ncd', 'ns', 'cd', 'cci', 'ct', 'ca', 'cpi', 'es', 'cr', 'pr', 'af', 'cdoc'],
        'sql_table': ['list', 'details', 'rd', 'fin', 'status', 'completed_details', 'syndicate', 'company_details', 'company_contact_info', 'company_team', 'company_advisors', 'company_pinvestors', 'company_execsum', 'company_current_rd', 'company_past_rd', 'company_ann_fin', 'company_docs']
        }
0
James Reade 28 Авг 2017 в 20:40

Я считаю, что вы ищете getattr ()

0
yugantar 28 Авг 2017 в 20:07

Я думаю, что eval может вам помочь.

>>> class MyClass():
...     pass
... 
>>> myinstance = Myclass()

>>> type(myinstance)
<class '__main__.Myclass'>

>>> type('myinstance')
<class 'str'>

>>> type(eval('myinstance'))
<class '__main__.Myclass'>
1
M3RS 28 Авг 2017 в 19:29