我正在为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搜索但没有成功。
答案 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
之前的部分为空或False
或None
或0
,则它们将全部替换为"NULL"