我用Python/ Scrapy编写了用于数据提取的代码。它对我来说很好,但我是Python方面的新手,所以欢迎对代码优化提出任何建议。
def parse(self, response):
hxs = HtmlXPathSelector(response)
item = GenesishcsItem()
item['graduate_education']=[]
item['medical_school']=[]
item['specialty']=[]
item['name']=ParseUtils.get_line_from_node(hxs.select(".//*[@id='DrDetail']//div[@class='Designations']/h1"))
image_url=hxs.select("//img[contains(@id,'DoctorProfilePicture')]/@src").extract()
if image_url:
item['image_url']=urljoin(response.request.meta['cached_meta']['response_url'],image_url[0])
for key,value in {'Gender:':'gender','Year joined staff:':'year_joined_staff'}.iteritems():
result=ParseUtils.get_line_from_node(hxs.select("//dt[contains(.,'%s')]/following-sibling::dd"%key))
if result:
item[value]=result
edu_data=['Education','Residency','Fellowship','Internships']
for edu in edu_data:
result_date=hxs.select("//h4[contains(.,'%s')]/following-sibling::dl[@class='%s']/dt"%(edu,edu))
result=hxs.select("//h4[contains(.,'%s')]/following-sibling::dl[@class='%s']/dd"%(edu,edu))
for date,value in zip(result_date,result):
date=date.select('./text()').extract()
value=value.select('./text()').extract()
if date:
date=date[0]
else:
date=None
if value:
value=value[0]
else:
value=None
if 'Education' in edu:
pass
item['medical_school'].append({'name':value,'graduation_year':date})
else:
item['graduate_education'].append({'name':value,'start_year_end_year':date,'type':edu.lower().strip()})
for rs in ParseUtils.get_text_from_node(hxs.select("//h3[contains(.,'Board Certified')]/following-sibling::p")):
item['specialty'].append({'name':rs,'certified':True})
return item发布于 2012-02-28 11:56:03
您的代码很混乱,很难理解。我相信,再过几个月,你就会浪费时间去理解你早些时候写的东西。因此,如果您不支持/扩展/重用您的项目,这是可以的。
Scrapy为正确地组织代码提供了相当好的架构:物品装载机和输入输出处理器、项目管道。它将移动处理逻辑,并使您的主解析方法更干净。
发布于 2012-02-28 09:56:44
代码看起来很好,但是和往常一样,总有一些问题可以提出。不过,我不认为它们很重要。您的代码似乎以简洁的方式获得了作业代码,如果您的XPath表达式是健壮的,则无需担心。
pass语句是无用的。date=date[0]时,看到代码复制有点令人难过,但是在Python中却是很难避免的。编写date = date[0] if date else none总是有可能的,但您可以说它更难阅读。result和value是模糊的。"//h4[contains(.,'%s')]/following-sibling::dl[@class='%s']),以便减少XPath表达式中的重复。https://codereview.stackexchange.com/questions/9509
复制相似问题