python中类的继承,初始化,super()__init__()方法

每日星语:

“你知道年轻的时候穷最大的问题是什么吗?”

“什么”

### “以为所有得不到的一切都是穷的错。眼睛盯着遥远的地方,却看不到身边一朵花的美丽”

2018-09-07 20:30:30 星期五

今天遇到一个问题,爬虫在定义网页规则时,因为有十几个站点来自于统一网站,刚开始考虑去复制一份,只需要修改web_site变量即可。但考虑到两点,其一,站点过多,复制麻烦,其二,也是最重要的一点,当网站结构变化时,修改维护起来过于冗余复杂,所以就使用了模板继承的办法!

刚开时circHeNan.py代码如下

# encoding: utf-8
from datetime import datetime
from .base_stock import BaseStock


class CircHeNan(BaseStock):


    def is_detail_url(self, dom):
        return dom("#ess_mailrightpane")

    def parse_detail_url(self, dom, params):

        web_site = "河南委员会"
        store_json = {
            "info:title": dom("#tab_content)").text(),
            "info:publish_time": dom("#tab_content > tbody:nth-child(1)").text(),
            "info:source": web_site,
            "info:author": "",
            "info:content": dom("#tab_content > tbody").outerHtml(),
            "info:tag": dom("head meta[name=\"keywords\"]").attr("content") or "",
            "info:dese": dom("head meta[name=\"description\"]").attr("content") or "",
            "info:crawl_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "info:url": params["info:url"],
            "info:channel": "",
            "info:laiyuan": web_site,
            "info:contain_image": "True" if dom("#tab_content > tbody")("img") else "False"
        }
        return store_json

由于该类继承与BaseStock

class BaseStock(object):

    def __init__(self):
        self.html_clean = html_clean.HTMLClean()
        self.html = ""
        self.web_site=""
考虑到BsaeStock为父类,当子类重写init时,子类就不会继承父类的init,所以需要对父类中init重写完整

将circ.py定义成模板

# encoding: utf-8
import re
from datetime import datetime
from .base_stock import BaseStock
from components import html_clean

class Csrc(BaseStock):
    def __init__(self):
        self.html_clean = html_clean.HTMLClean()
        self.html = ""
        self.web_site = ""

    def is_detail_url(self, dom):
        return dom(".content")

    def parse_detail_url(self, dom, params):
        store_json = {

            "info:title": dom("#tab_content)").text(),
            "info:publish_time": dom("#tab_content > tbody:nth-child(1)").text(),
            "info:source":self.web_site,
            "info:author": "",
            "info:content": dom("#tab_content > tbody").outerHtml(),
            "info:tag": dom("head meta[name=\"keywords\"]").attr("content") or "",
            "info:dese": dom("head meta[name=\"description\"]").attr("content") or "",
            "info:crawl_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "info:url": params["info:url"],
            "info:channel": "",
            "info:laiyuan": self.web_site,
            "info:contain_image": "True" if dom("#tab_content > tbody")("img") else "False"
        }
        return store_json

修改circHeNan.py文件里的内容如下:

from .circ import Circ
from components import html_clean

class CircHeNan(Circ):
    def __init__(self):
        self.html_clean = html_clean.HTMLClean()
        self.html = ""
        self.web_site = "河南委员会"

这时候的circHeNan.py虽然只有很少的几行,但这时候的代码效果和刚开始的一样了

更新文章
2018-09-11 20:43:54 星期二

在多重类的继承过程中,其实存在这super().__init__()的方法,这个方法可以很好的解决冲突问题,上面的文掌可以不需要这么复杂,只需要用super()完美解决 将模板文件circ.py修改如下

import re
from datetime import datetime
from .base_stock import BaseStock
class Csrc(BaseStock):
    def __init__(self):
        super(Csrc,self).__init__()
        self.web_site = ""
    def is_detail_url(self, dom):
        return dom(".content")
    def parse_detail_url(self, dom, params):
        store_json = {
            "info:title": dom("#tab_content)").text(),
            "info:publish_time": dom("#tab_content > tbody:nth-child(1)").text(),
            "info:source":self.web_site,
            "info:author": "",
            "info:content": dom("#tab_content > tbody").outerHtml(),
            "info:tag": dom("head meta[name=\"keywords\"]").attr("content") or "",
            "info:dese": dom("head meta[name=\"description\"]").attr("content") or "",
            "info:crawl_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "info:url": params["info:url"],
            "info:channel": "",
            "info:laiyuan": self.web_site,
            "info:contain_image": "True" if dom("#tab_content > tbody")("img") else "False"
        }
        return store_json

而circHeNan.py的文件可以修改为

from .circ import Circ
class CircHeNan(Circ):
    def __init__(self):
        super()__init__()
        self.web_site = "河南委员会"

简单案例可以参考这个这个页面 的实例部分,看懂了就理解了

转载于:https://my.oschina.net/mypeng/blog/1982629

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值