#coding=utf-8
from time import sleep
import unittest
from selenium import webdriver
from selenium.webdriver import Remote
from selenium.webdriver.common.by import By#元素定位
import sys

def browser():#启动浏览器驱动
    '''
    driver = Remote(command_executor='http://127.0.0.1:4444/wd/hub',
                                                desired_capabilities={'platform':'ANY',
                                                                      'browserName':'chrome',
                                                                      'version':'',
                                                                     })'''
    driver = webdriver.Ie()
    return driver

class MyTest(unittest.TestCase):#框架

    def setUp(self):
        print("开始执行用例!")
        self.driver = browser()
        self.driver.implicitly_wait(10)
        self.driver.maximize_window()

    def tearDown(self):
        self.driver.quit()
        print('用例执行结束!')
        
class Page(object):#基础类
    '''
    页面基础类,用于所有页面的继承
    '''
    bbs_url = 'https://book.douban.com/'
    
    def __init__(self,selenium_driver,base_url=bbs_url,parent=None):#初始化
        self.base_url = base_url
        self.driver = selenium_driver
        self.timeout = 30
        self.parent = parent
    
    def on_page(self):#断言url是否相等
        return self.driver.current_url == (self.base_url + self.url)
        
    def _open(self,url):
        url = self.base_url + url
        self.driver.get(url)
        assert self.on_page(),'获取的url和当前url不匹配.url:%s' % url
          
    def open(self):#打开浏览器  
        self._open(self.url)
    
    def find_element(self,*loc):#单个元素定位
        return self.driver.find_element(*loc)
    
    def find_elements(self,*loc):#多个元素定位
        return self.driver.find_elements(*loc)
    

class Douban_film(Page):#页面对象封装
    u'''豆瓣读书排序'''
    url = '/'
    #元素定位
    bbs_booknum_loc = (By.XPATH,'//li/div[2]/p[1]/span[2]')#评分
    bbs_bookname_loc = (By.XPATH,'//li/div[2]/h4/a')#书名
    bbs_bookauther_loc = (By.XPATH,'//li/div[2]/p[2]')#作者
    bbs_booktype_loc = (By.XPATH,'//li/div[2]/p[3]')#类型
    bbs_bookcomments_loc = (By.XPATH,'//li/div[2]/p[5]')#评论
    #元素封装
    def bbs_bookname(self):#豆瓣评分
        _input = self.driver.find_elements(*self.bbs_bookname_loc)# 选择页面上所有的tag name 为input 的元素
        bookname = []
        for i in _input:
            bookname.append(i.text)#取出值并添加到数组
        else:
            sleep(1)
        return bookname
                              
    def bbs_booknum(self):#豆瓣评分
        _input = self.driver.find_elements(*self.bbs_booknum_loc)# 选择页面上所有的tag name 为input 的元素
        booknum = []
        for i in _input:
            booknum.append(i.text)#取出值并添加到数组
        else:
            sleep(1)
        return booknum
        
    def bbs_bookauther(self):#作者
        _input = self.driver.find_elements(*self.bbs_bookauther_loc)# 选择页面上所有的tag name 为input 的元素
        bookauther = []
        for i in _input:
            bookauther.append(i.text)#取出值并添加到数组
        else:
            sleep(1)
        return bookauther

    def bbs_booktype(self):#类型
        _input = self.driver.find_elements(*self.bbs_booktype_loc)# 选择页面上所有的tag name 为input 的元素
        bookautype = []
        for i in _input:
            bookautype.append(i.text)#取出值并添加到数组
        else:
            sleep(1)
        return bookautype
        
    def bbs_bookcomments(self):#评论
        _input = self.driver.find_elements(*self.bbs_bookcomments_loc)# 选择页面上所有的tag name 为input 的元素
        bookaucomments = []
        for i in _input:
            bookaucomments.append(i.text)#取出值并添加到数组
        else:
            sleep(1)
        return bookaucomments
    
    def out_node(self):#排序
        list1 = self.bbs_booknum()
        list2 = self.bbs_bookname()
        list3 = self.bbs_bookauther()
        list4 = self.bbs_booktype()
        list5 = self.bbs_bookcomments()
        list = [[a,b,c,d,e] for a,b,c,d,e in zip(list1,list2,list3,list4,list5)]
        team = list[:]
        team.sort()
        print('从小到大排序:%s'%team)
        return team
    
    def writetxt(self):#写入txt文件
        a = self.out_node()
        f1 = open('b.txt','w',encoding='utf-8')#写入文件编码格式,不写的话有时候会导致解析错误   
        for i in a:#循环读取内嵌列表
            #if isinstance(i,list):#判断是否是一个列表
            print(i)#分别打印内嵌列表里的列表
            f1.writelines(i)#写入txt文件
            f1.write('\n')#写入文件时换行
        f1.close()
          
class test_Douban_film(MyTest):
    u'''豆瓣读书排序'''
    
    def test1(self):
        u'''豆瓣评分按降序排列并保存到txt文件'''
        p1 = Douban_film(self.driver)
        p1.open()
        p1.writetxt()

if __name__ == '__main__':
    unittest.main()

使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中的更多相关文章

  1. 按行读取TXT文件中的内容

    public Dictionary<int, string> GetDicFromLog() { try { StreamReader sr = new StreamReader(file ...

  2. 从txt文件中读取数据放在二维数组中

    1.我D盘中的test.txt文件内的内容是这样的,也是随机产生的二维数组 /test.txt/ 5.440000 3.4500006.610000 6.0400008.900000 3.030000 ...

  3. 读取同一文件夹下多个txt文件中的特定内容并做统计

    读取同一文件夹下多个txt文件中的特定内容并做统计 有网友在问,C#读取同一文件夹下多个txt文件中的特定内容,并把各个文本的数据做统计. 昨晚Insus.NET抽上些少时间,来实现此问题,加强自身的 ...

  4. SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中

    在数据库时候我设计了学生的分数为nvarchar(50),是为了在从TXT文件中读取数据插入到数据库表时候方便,但是在后期由于涉及到统计问题,比如求平均值等,需要int类型才可以,方法是:Conver ...

  5. Java中读取txt文件中中文字符时,出现乱码的解决办法

    这是我写的一个Java课程作业时,遇到的问题. 问题描述: 我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组. 我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码. 最 ...

  6. Flex读取txt文件中的内容(三)

    Flex读取txt文件中的内容 1.设计源码 LoadTxt.mxml: <?xml version="1.0" encoding="utf-8"?> ...

  7. Flex读取txt文件中的内容(二)

    Flex读取txt文件中的内容 自动生成的文件 LoadTxt-app.xml: <?xml version="1.0" encoding="utf-8" ...

  8. Flex读取txt文件中的内容(一)

    Flex读取txt文件中的内容 phone.txt: 13000003847 13000003848 13000003849 13000003850 13000003851 13000003852 1 ...

  9. Flex读取txt文件中的内容报错

    Flex读取txt文件中的内容 1.具体错误如下 2.错误原因 读取文件不存在 var file:File = new File(File.applicationDirectory.nativePat ...

随机推荐

  1. 微信小程序开发心得

    微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...

  2. LDR详解

    ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是"LDR Rn,=expr".下面举一个例子来说明它的用法. COUNT EQU       ...

  3. ASP.NET Core 1.1.0 Release Notes

    ASP.NET Core 1.1.0 Release Notes We are pleased to announce the release of ASP.NET Core 1.1.0! Antif ...

  4. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  5. async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

  6. DB1:数据库的创建和文件的修改

    在SQL Server中,使用Create Database创建数据库,使用Alter Database命令,能够修改数据库的数据文件和日志文件. 一,创建数据库 1,在创建数据库时,最佳实践是: 创 ...

  7. 工厂方法模式——创建型模式02

    1. 简单工厂模式     在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...

  8. OVS local network 连通性分析 - 每天5分钟玩转 OpenStack(132)

    前面已经创建了两个 OVS local network,今天详细分析它们之间的连通性. launch 新的 instance "cirros-vm3",网络选择 second_lo ...

  9. 创建APPID&&部署服务端教程

    创建APPID&&部署服务端 一.创建APPID 1.打开https://console.developers.google.com ,左击顶部Project,然后左击创建项目 2.输 ...

  10. Android中通过ActionBar为标题栏添加搜索以及分享视窗

    在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果.Action ...