面向对象封装

20842 단어
在前文书写代码的时候,脚本已经实现了基本的功能,从一个HTML中提取出我们想要信息.但是,还
  • 可封装性差
  • 接口定义不清楚
  • 迭代困难

  • Google 页面 Serp p 经常 会 会 遇到 一些 小 调整 调整 调整 调整 调整 调整 我们 代码 代码 代码 必然 要 经常 经常 进行 更新 更新 更新 更新 更新 我们 就 就 需要 保证 保证 代码 代码 的 简洁性 简洁性. 在 这 个 项目 中 中 我们 把握 个 个 : : : 对象 : : 对象 : : : : : : : : : 个 个 个는지

    那么什么是面向对象?

    class GoogleSpider(object):
        def __get_total_page(self):
            pass
    
        def search_text(self):
            pass
    
        def search_videos(self):
            pass
    
        def search_wiki(self):
            pass
    ...
    


    这 这 代码 代码 代码 代码 是 是 将 我们 刚刚 写出 的 的 函数 封装 在 在 一 一 个 个 个 googlespider 类 中 中 中 中 看似 是 用 用 用 了 面向 面向 对象 的 写法 写法 写法 写法 中 中 的 方法 和 数据 并 并 并 没有 没有 发生 发生 关联 关联 还 再 再 进一步 进一步 进一步 进一步 进一步. 中 的 的 的 中 中 中 中 中 中 的 的 的 的 的 的 用 用 用 了 了 面向 对象 对象 的 写法 写法 写法 类 中 中 中 中 中 用 用 用 用 了 了 面向 对象 对象 的 写法 写法 写法 类 中 中 中 中 中 中 用 用 用 用 了 了 面向 对象 对象 的 写法 写法 写法 类 中 中 中 中 中 中 用 인

    前文中,我们的输出会输出爬取内容的内容,即 type字段.

    在这里,我们类中提前定义四种类型.

    完整的面向对象代码,如下所示:

    class GoogleSpider(AttribDict):
        __exclude_keys__ = {'soup'}
    
        def __init__(self, soup: BeautifulSoup):
            self.videos = []
            self.wiki = []
            self.page = 0
            self.news = []
            self.main = []
            self.soup = soup
    
        def __get_total_page(self):
            """获取当前页面总数"""
            pages_ = self.soup.find('span', id='xjs').findAll('td')
            maxn = 0
            for p in pages_:
                try:
                    if int(p.text) > maxn:
                        maxn = int(p.text)
                except:
                    pass
            self.page = maxn
    
    
        def __search_main(self):
            """解析主要搜索结果"""
    
            # 获取所有的主要搜索结果
            result_containers = self.soup.findAll('div', class_='g')
    
            for container in result_containers:
                # title提取
                try:
                    title = container.find('h3').text
                    # 对应链接提取
                    url = container.find('a')['href']
                    # 对应描述提取
                    des = container.find('span', class_='aCOpRe').text
                    self.main.append({
                        'title': title,
                        'url': url,
                        'des': des,
                    })
                except Exception:
                    continue
    
        def __search_wiki(self):
            """解析wiki内容"""
            container = self.soup.find('div', class_='kp-wholepage')
            # 如果container为None,则返回空列表
            if container is None:
                return []
            # Title
            title = container.find('h2', attrs={'data-attrid': 'title'}).find('span').text
            # Subtitle
            try:
                subtitle = container.find(
                    'div', attrs={'data-attrid': 'subtitle'}).text
            except AttributeError:
                subtitle = None
            # Description
            des = container.find('div', class_='kno-rdesc').find('span').text
            # 获取Wiki链接
            url = container.find('div', class_='kno-rdesc').find('a')['href']
            # Details内容
            try:
                # div.wp-ms对应不同的四个card
                table = container.findAll(
                    'div', class_='wp-ms')[2].findAll('tr', class_='kno-nf-nr')[1:]
            except IndexError:
                table = []
            details = []
    
            for row in table:
                name = row.find('span').text.strip(': ')
                detail_ = row.findAll('span')[1:]
                detail = ''
                for _ in detail_:
                    detail += _.text + ' '  # 以 key value的形式输出结果
                details.append({
                    'name': name,
                    'detail': detail.strip()
                })
            result = {
                'title': title,
                'subtitle': subtitle,
                'des': des,
                'url': url,
                'details': details,
            }
            self.wiki = [result]
    
    
        def __search_news(self):
            try:
                cards = self.soup.find('g-scrolling-carousel').findAll('g-inner-card')
            except AttributeError:
                return []
    
            for card in cards:
                title = card.find('div', role='heading').text
                href = card.find('a')['href']
                result = {
                    'title': title,
                    'href':href,
                }
                self.news.append(result)
    
    
        def __search_videos(self):
            try:
                cards = self.soup.find('div', id='search').findAll('div', class_='VibNM')
            except AttributeError:
                return []
    
            for card in cards:
                title = card.find('div', role='heading').text
                href = card.find('a')['href']
                result = {
                    'title': title,
                    'href':href,
                }
                self.videos.append(result)
    
    
        def search(self):
            self.__get_total_page()
            self.__search_main()
            self.__search_news()
            self.__search_videos()
            self.__search_wiki()
    
    
    spider = GoogleSpider(soup)
    spider.search()
    


    可以 可以 可以 可以 可以 面向 面向 对象 的 之后 之后 之后 之后 最 的 的 的 就 是 注释 变少 变少 变少 变少 变少 是 输入 输入 和 和 和 输出 都 不 不 需要 需要 显示 指定 了 了 我们 可以 使用 更加 多 的 的 设计 设计 模式 来 进一步 进一步 完善 我们 我们 这个 GoogleSpider类.

    좋은 웹페이지 즐겨찾기