【Python第四课】Xpath数据解析

【Python第四课】Xpath数据解析_第1张图片
【Python第四课】Xpath数据解析_第2张图片
【Python第四课】Xpath数据解析_第3张图片
【Python第四课】Xpath数据解析_第4张图片
【Python第四课】Xpath数据解析_第5张图片
【Python第四课】Xpath数据解析_第6张图片
【Python第四课】Xpath数据解析_第7张图片
【Python第四课】Xpath数据解析_第8张图片
【Python第四课】Xpath数据解析_第9张图片
1.Xpath的基本操作

from lxml import etree

text = '''



    
    学习猿地 - 成就自己的只需一套精品


    


'''


#第一种方式,读取⼀个html⽂件并解析

# 使用etree解析html字符串
html = etree.HTML(text)

# 提取数据
r = html.xpath('/html/body/ul/li/a/text()')
# ['java工程师', 'python工程师', 'AI工程师']
# print(r)

r = html.xpath('/html/body/ul/li[1]/a/text()')
# print(r)  #['java工程师']


#第二种方式,读取⼀个html⽂件并解析
html = etree.parse('./test.html', etree.HTMLParser())
# print(html)

# 提取数据
r = html.xpath('/html/body/ul/li/a/text()')
print(r)

2.xpath数据解析方法

from lxml import etree


# 解析html文件
html = etree.parse('./test.html', etree.HTMLParser())

# 提取数据

# r = html.xpath('/html/body/ul/li/a/text()')
# print(r)

# 获取页面中所有的li里面的数据
# r = html.xpath('//li/a/text()')
# print(r)

# 获取指定标签里面的li数据
t = html.xpath('//div[@class="teacher"]//li/a/text()')
# print(t)
h = html.xpath('//div[@class="teacher"]//li/a/@href')
# print(h)

res = list(zip(t,h))
print(res)

#
'''
/ 当前元素的直接子节点
// 当前元素的子节点或孙子节点

text() 获取文本
@attr 获取属性对应的值
'''



3.Xpath实战登录

import requests
from lxml import etree


# 封装类。进行学习猿地的登录和订单的获取
class LMonKey():
    # 登录请求地址
    loginurl = 'https://www.lmonkey.com/login'
    # 账户中心地址
    orderurl = 'https://www.lmonkey.com/my/order'
    # 请求头header
    headers = {
     
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
    }
    # 请求对象
    req = None
    # token口令
    token = ''
    # 订单号
    ordercode = 0


    # 初始化方法
    def __init__(self):
        # 请求对象的初始化
        self.req = requests.session()
        if self.getlogin():
            if self.postlogin():
                self.getorder()

    # get 登录页面 获取_token
    def getlogin(self):
        # 1。get请求 login页面,设置cookie,获取_token
        res = self.req.get(url=self.loginurl,headers=self.headers)
        if res.status_code == 200:
            print('get登录页面请求成功')
            html = etree.HTML(res.text)
            self.token = html.xpath('//input[@name="_token"]/@value')[0]
            print('token获取成功')
            return True
        else:
            print('请求错误')

    # post 请求登录 设置cookie
    def postlogin(self):
        uname = input('手机号:')
        passw = input('密码:')
        data = {
     
            '_token':self.token,
            'username':uname,
            'password':passw
        }
        # 发起post请求
        res = self.req.post(url=self.loginurl,headers=self.headers,data=data)
        if res.status_code == 200 or res.status_code == 302:
            print('登录成功')
            # 请求订单数据
            return True

    # get 请求账户中心 获取默认订单号
    def getorder(self):
        # 3。get请求 账户中心,获取默认订单号
        res = self.req.get(url=self.orderurl,headers=self.headers)
        if res.status_code == 200:
            print('账户中心请求成功,正在解析数据')
            html = etree.HTML(res.text)
            r = html.xpath('//div[@class="avatar-content"]//small/text()')
            print(r)
            self.ordercode = r



obj = LMonKey()

4.Xpath实战猿著

import requests,json
from lxml import etree

class Yq():
    # 请求的地址 猿著
    url = 'https://www.lmonkey.com/essence'

    # 请求头header
    headers = {
     
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
    }
    # 爬取的数据
    data = ''
    # 存储数据
    filepath = './yq.json'

    # 初始化
    def __init__(self):
        # 发送请求
        res = requests.get(url = self.url,headers = self.headers)
        if res.status_code == 200:
            print('数据请求成功,正在写入')
            # 请求的内容写入文件
            with open('./yq.html','w') as fp:
                fp.write(res.text)
            if self.pasedata():
                self.writedata()

    # 解析数据
    def pasedata(self):
        print('解析数据')
        # 解析数据
        html = etree.parse('./yq.html', etree.HTMLParser())

        # 提取数据 作者 文章标题 文章地址url
        authors = html.xpath('//div[contains(@class,"old_content")]//div[contains(@class,"list-group-item-action")]//strong/a/text()')
        titles = html.xpath('//div[contains(@class,"old_content")]//div[contains(@class,"list-group-item-action")]//div[contains(@class,"flex-fill")]//div/text()')
        titleurl = html.xpath('//div[contains(@class,"old_content")]//div[contains(@class,"list-group-item-action")]//div[contains(@class,"flex-fill")]/a/@href')

        # 整理数据
        data = []
        for i in range(0,len(authors)):
            res = {
     'author':authors[i],'title':titles[i],'url':titleurl[i]}
            data.append(res)
        self.data = data
        return True

    #写入数据
    def writedata(self):
        print('写入数据')
        with open(self.filepath,'w') as fp:
            json.dump(self.data,fp)


# 实例化对象
Yq()

你可能感兴趣的:(Python系列,python)