2015-02-11 132 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

相關問題