爬虫核心基础第五讲(Xpath)

xpath

xpath简介

xpath是一种html和xml的查询语言,它能够在xml和html的树状结构中寻找节点
在文档中通过元素和属性进行导航
简单一句话是可以根据地址找人的技术

xpath-helper的使用

常用节点选择工具

  • chrome插件 XPathHelper
  • Firefox插件 XPathHelper

安装好之后点击ctrl + shift + x启动或关闭插件
爬虫核心基础第五讲(Xpath)_第1张图片
在这里插入图片描述

element对象

# 在Python中,我们安装lxml库来使用xpath技术

# pip install lxml

from lxml import etree

# etree这个类具体能做什么?
# 第一个 将html字符转换成为element对象
# 第二个 element对象可以转换为字符串或者二进制的类型
wb_data = """
        
        """

html = etree.HTML(wb_data)
result = etree.tostring(html)  # 类型是字节 
print(result.decode())

xpath

from lxml import etree

MyStr = '''
    
    
    
    
    
    
    
    
    
    
    
    
    
    
'''

HtmlElement = etree.HTML(MyStr)

# 需求我要找href所对应的数据 //link/@href

EleList = HtmlElement.xpath('//link/@href')

# 提取数据 就可以遍历这个列表

for i in EleList:

    print(i)

节点之间的关系

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
选取当前节点的父节点
@ 选取属性
# 测试代码
'''
(文档的节点)


    Harry Potter(属性节点)
    J K.Rowling(元素的节点)
    2005
    29.99




Nodename节点的名字 有七种类型的节点 元素 属性 文本 命名空间 处理指令 注释 文档(根)节点
book元素是 title author year price元素的父类
title author year price元素同胞 (拥有相同的父节点)
(先辈)某节点的父或者父的父 title元素的先辈是book元素和bookstore
'''

选取节点

选取节点

# 选取节点
from lxml import etree

html = etree.parse('./test.html',etree.HTMLParser())

# result = etree.tostring(html)
#
# # print(html)  # 
# print(result)

# # //* 表示匹配所有的节点
# result = html.xpath('//*')
# print(result)

# 找到指定节点,获取所有li节点
# /从根节点选取 a/b/c
# result = html.xpath('//li/a')

# 获取scr2属性所对应的a标签的父节点class的名
# 
  • second
  • # @class # result = html.xpath('//a[@src2="link2.html"]/../@class') # @ 获取属性值src # result = html.xpath('//li/a/@src') # 获取文本的时候 text() # 获取属性class的值为item-0的li标签的子节点a标签的文本内容 #
  • first item
  • result = html.xpath('//li[@class="item-0"]/a') for i in result: print(i.text) print(result)

    豆瓣练习

    **注意:**遇到输出错误时,加入headers即可,输出显示时就正确往下执行

    # 需求:获取电影的标题 引言 评分 网址 每一页的内容全部抓取并保存到csv文件当中
    
    # https://movie.douban.com/top250?start=0&filter= 第一页
    
    # https://movie.douban.com/top250?start=25&filter= 第二页
    
    # https://movie.douban.com/top250?start=50&filter= 第三页
    
    # https://movie.douban.com/top250?start=75&filter= 第四页
    
    # 页数url的规律是 (当前页数-1)*25
    
    import requests
    
    import lxml.html
    
    import csv
    
    # 找到目标的url
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
    doubanUrl = 'https://movie.douban.com/top250?start={}&filter='
    
    
    # 找到我们想要的数据 html源代码
    def getSource(url):
        # 请求目标网页
        response = requests.get(url,headers=headers)
    
        # 以防出现乱码 编码格式
        response.encoding = 'utf-8'
    
        return response.text
    
    # getSource(doubanUrl)
    # 引言 评分 网址 标题 --->  网页源代码中
    
    def getEveryItem(source):
        # 生成一个Html对象
        selector = lxml.html.document_fromstring(source)
    
        # 通过selector对象来找到 电影信息
        movieItemList = selector.xpath('//div[@class="info"]')
    
        # 定义一个变量 展示电影信息
        # 展示出来的信息[{电影1},{电影2},{电影3}]
        movieList = []
    
        # 通过for循环来遍历 info电影信息
        for eachMovie in movieItemList:
            # 创建一个字典 保存电影信息 引言 评分 网址 标题
            movieDict = {}
    
            title = eachMovie.xpath('div[@class="hd"]/a/span[1]/text()')  # 标题
            otherTitle = eachMovie.xpath('//div[@class="hd"]/a/span[2]/text()')  # 副标题
            link = eachMovie.xpath('div[@class="hd"]/a/@href')[0]  # url
            star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0]  # 评分
            quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()')  # 引言 (名句)
    
            if quote:
                quote = quote[0]
            else:
                quote = ' '
                
            # 把电影数据保存到字典当中
            movieDict['title'] = ''.join(title + otherTitle)
            movieDict['url'] = link
            movieDict['star'] = star
            movieDict['quote'] = quote
    
            print(movieDict)
            movieList.append(movieDict)
    
        return movieList
    
    
    # 写入数据 csv文件当中
    
    def writeData(movieList):
        with open('DoubanMovie.csv', 'w', encoding='utf-8') as f:
            writer = csv.DictWriter(f, fieldnames=['title', 'star', 'quote', 'url'])
    
            writer.writeheader()  # 写入表头
    
            for each in movieList:
                # 逐行写入
                writer.writerow(each)
    
    
    # 启动程序
    
    if __name__ == '__main__':
    
        movieList = []
        # 因为一共有10页所以循环10次
        for i in range(10):
    
            # 获取url
            pageLink = doubanUrl.format(i * 25)
    
            print(pageLink)
    
            source = getSource(pageLink)
    
            movieList += getEveryItem(source)  # movieList = movieList + getEveryItem(source)
    
        # print(movieList[:10])
    
        writeData(movieList)
    
    

    你可能感兴趣的:(爬虫核心基础第五讲(Xpath))