2015-02-11 105 views
0

我正在为OpenData编写一个python刮板代码,并且我有一个问题:如何检查所有值是否未填充到站点中,以及它是否为null将值更改为null。我的刮板是here如何检查Python中的许多变量是否为空?

目前我正在努力优化。

我现在变量样子:

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

_if取代它为空值更改为null_:如果是'null',那么它已经是'null',你什么都不做。你的意思是“空”作为一个字符串? – rodrigo 2015-02-11 09:53:06

+0

如果这些值未填满,它们将会是什么? – 2015-02-11 10:06:17

+0

如果你运行批量上传,你需要有一些东西作为价值。实际日期或无效。刮过的网站有两个日期值,一个用于接受发票,另一个用于发票付款。如果你的弹力十足,你可以选择这个日期。但是另一个用例是从具有空值的弹性字段中选择,然后通知本网站的系统管理员他没有好的数据并且与法律相冲突。 – 2015-02-11 11:47:42

回答

1

刚刚看了你的连接纽带,它似乎你想要的是

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

但要小心。你应该只用字符串来做到这一点。如果or之前的部分为空或者FalseNone,或0,他们都将与"NULL"

+0

感谢这有助于快速:) – 2015-02-11 11:30:43

+0

这是我的python scraper。也许它有助于某人: http://pastebin.com/j911H5qZ – 2015-05-01 19:09:55

+0

一个git diff可能更有用https://github.com/Pytlicek/SK_Prison_and_Court_Guard/commit/9c528b59406a940e1bcf305ebd69a912b19bc997 – 2015-05-04 10:38:36

2

首先,写出的形式的变量的结构字典:

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

即关键是输出键,值是ID的从soup.find_all('td')并且具有要被施加到的可选功能的元组结果,否则为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对象?

+0

确定比我的建议更详细。尽管如此,如果每个变量的函数都是相同的,那么可能会过度杀伤。 – Junuxx 2015-02-11 10:01:09

+0

非常感谢,我将重写无斯洛伐克代码的变量。我需要null因为我打算导出为json并将数据导入到Elastic中,并且如果需要使用日期字段进行操作,则必须将其设置为null。 – 2015-02-11 11:21:37

+1

是的,使用'None',而不是'Null'。 SQLite和Postgres都支持'None'。 – Michael 2015-02-11 14:00:09