首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据提取

数据提取
EN

Code Review用户
提问于 2012-02-28 09:19:39
回答 2查看 1.4K关注 0票数 2

我用Python/ Scrapy编写了用于数据提取的代码。它对我来说很好,但我是Python方面的新手,所以欢迎对代码优化提出任何建议。

代码语言:javascript
复制
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
EN

回答 2

Code Review用户

发布于 2012-02-28 11:56:03

您的代码很混乱,很难理解。我相信,再过几个月,你就会浪费时间去理解你早些时候写的东西。因此,如果您不支持/扩展/重用您的项目,这是可以的。

Scrapy为正确地组织代码提供了相当好的架构:物品装载机和输入输出处理器项目管道。它将移动处理逻辑,并使您的主解析方法更干净。

票数 1
EN

Code Review用户

发布于 2012-02-28 09:56:44

代码看起来很好,但是和往常一样,总有一些问题可以提出。不过,我不认为它们很重要。您的代码似乎以简洁的方式获得了作业代码,如果您的XPath表达式是健壮的,则无需担心。

  • 你有实际的性能问题吗?如果是这样的话,你应该分析一下你的代码,看看你的程序大部分时间都花在哪里了。
  • 代码末尾的pass语句是无用的。
  • 当您执行date=date[0]时,看到代码复制有点令人难过,但是在Python中却是很难避免的。编写date = date[0] if date else none总是有可能的,但您可以说它更难阅读。
  • 重新分配变量的方式有点危险,因为名称引用不同的类型,这取决于“当前行号”。对于小脚本来说,这是可以的。
  • 试图找到更多描述性的名字,resultvalue是模糊的。
  • 您可以“缓存”一些节点(例如。"//h4[contains(.,'%s')]/following-sibling::dl[@class='%s']),以便减少XPath表达式中的重复。
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/9509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档