如果不是null,如何检查Python中的许多变量?

时间:2015-02-11 09:47:29

标签: python sqlite

我正在为OpenData编写一个python scraper代码,我有一个问题:如何检查是否所有值都没有在站点中填充,如果它是null,则将值更改为null。

我的刮刀是here

目前,我正在努力实现最佳化。

我的变量现在看起来像:

    evcisloval = soup.find_all('td')[3].text.strip()
    prinalezival = soup.find_all('td')[5].text.strip()
    popisfaplnenia = soup.find_all('td')[7].text.replace('\"', '')
    hodnotafaplnenia = soup.find_all('td')[9].text[:-1].replace(",", ".").replace(" ", "")
    datumdfa = soup.find_all('td')[11].text
    datumzfa = soup.find_all('td')[13].text
    formazaplatenia = soup.find_all('td')[15].text
    obchmenonazov = soup.find_all('td')[17].text
    sidlofirmy = soup.find_all('td')[19].text
    pravnaforma = soup.find_all('td')[21].text
    sudregistracie = soup.find_all('td')[23].text
    ico = soup.find_all('td')[25].text
    dic = soup.find_all('td')[27].text
    cislouctu = soup.find_all('td')[29].text

输出:

scraperwiki.sqlite.save(unique_keys=["invoice_id"],
                                    data={  "invoice_id":number,
                                            "invoice_price":hodnotafaplnenia,
                                            "evidence_no":evcisloval,
                                            "paired_with":prinalezival,
                                            "invoice_desc":popisfaplnenia,
                                            "date_received":datumdfa,
                                            "date_payment":datumzfa,
                                            "pay_form":formazaplatenia,
                                            "trade_name":obchmenonazov,
                                            "trade_form":pravnaforma,
                                            "company_location":sidlofirmy,
                                            "court":sudregistracie,
                                            "ico":ico,
                                            "dic":dic,
                                            "accout_no":cislouctu,
                                            "invoice_attachment":urlfa,
                                            "invoice_url":url})

我用Google搜索但没有成功。

2 个答案:

答案 0 :(得分:2)

首先,以下列形式编写变量的配置字典:

conf = {'evidence_no': (3, str.strip),
        'trade_form': (21, None),
         ...}

即。 key是输出键,value是来自soup.find_all('td')的id的元组,以及必须应用于结果的可选函数,否则为None。你不需要那些可能会混淆其他SO成员的斯拉夫变量名。

然后迭代conf并填写data字典。

此外,在循环之前运行soup.find_all('td')

tds = soup.find_all('td')

data = {}
for name, (num, func) in conf.iteritems():
    text = tds[num].text

    # replace text with None or "NULL" or whatever if needed
    ...

    if func is None:
        data[name] = text
    else:
        data[name] = func(text)

这将删除大量重复的代码。更易于维护。

另外,我不确定字符串"NULL"是编写缺失数据的最佳方法。没有sqlite支持Python的真实None对象吗?

答案 1 :(得分:1)

只需阅读您附加的链接,看起来您想要的是

evcisloval = soup.find_all('td')[3].text.strip() or "NULL"

但要小心。你应该只用字符串来做这件事。如果or之前的部分为空或FalseNone0,则它们将全部替换为"NULL"