Xml和Xpath语法

一.XML
1.什么是XML
  • XML指可扩展标记语言(EXtensible Markup Language)
  • XML是一种标记语言,和HTML类似
  • XML的设计宗旨是传输数据,而非显示数据
  • XML的标签需要我们自行定义
  • XML被设计为具有自我描述性
  • XML是W3C的推荐标准
  • W3C的官方文档:http://www.w3school.com.cn/xml/index.asp
2.XML和HTML的区别
  • 他们两者都适用于操作数据或者数据结构,在结构上大致相同,但他们的本质上却存在着明显的区别.
数据格式描述
XMLEXtensible Markup Language 可扩展标记语言,被设计为传输和存储数据,其焦点是数据的内容
HTMLHyperText Markup Language 超文本标记语言,显示数据以及如何更好地显示数据
HTML DOMDocument Object Model for HTML 超文本文档对象模型,可以访问所有的HTML元素,连同他们所包含的文本和属性.可以对其中 的内容进行修改和删除,同时也可以创建新的元素
3.XML的节点关系
  • 父(Parent)

    每个元素以及属性都有一个父.

  • 子(Children)

    元素节点可能有0个,一个或多个子.

  • 同胞(Sibling)

    拥有相同的父的节点

  • 先辈(Ancestor)

    某节点的父,父的父等.

  • 后代(Descendant)

    某个节点的子,子的子等

二.XPATH(XML Path Language)

XPATH是一门在XML中查找信息的语言,可用来在XML文档中对元素和属性进行遍历.

1.选取节点

XPATH使用路径表达式来选取xml文档中的节点或者节点集,

表达式描述
nodename选取此节点的所有节点
/从节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点
..选取当前节点的父节点
@选取属性
2.谓语

谓语用来查找某个特定的节点或者包含某个指定值的节点,被嵌在方括号中

路径表达式描述
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素
/bookstore/book[position() < 3]选最前面的两个属于 bookstore 元素的子元素的 book 元素
//title[@lang]选取所有属性名为 lang 的属性的 title 元素
//titlel@lang='eng选取所有 tltle 元素,且这些元素有属性值为 eng 的 lang 属性
3.选取未知节点

xpath通配符可用来选取未知的xml元素

路径表达式描述
//bookstore/*选取 bookstore 元素的所有子元素
//*选取文档中所有的元素
//title[@*]选取所有带有属性title的元素
4.选取若干路径
路径表达式描述
//book/title//book/price选取book元素的所有title和price元素
//title//price选取文档中所有的title和price元素
//price选取文档中所有的price元素
三.案例
1.获取扇贝单词中python的全部单词

# 需求:
# 获取单词及其解释

import requests
from lxml import etree

# 定义请求头
headers = {
    'User-Agent': 自己网页上的用户登录,
}

response = requests.get(url='https://www.shanbay.com/wordlist/110521/232414/?page=1',headers=headers)

# etree.HTML()将字符串转换成html元素对象
html = etree.HTML(response.text)

# 使用xpath提取数据
tr_list = html.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')

# 使用循环获取每一个单词及解释
for tr in tr_list:
    # 获取单词
    word = tr.xpath('./td[@class="span2"]/strong/text()')[0]
    # 获取翻译
    explain = tr.xpath('./td[@class="span10"]/text()')[0]

    print(word,explain)
    
2.获取股吧的数据

# 股吧抓取:
# 网址:https://guba.eastmoney.com/
# 需求:
# 1、获取阅读、评论、标题、作者、更新时间
# 2、将数据保存至Excel中

# 1. 导入requests
import requests,re
from openpyxl import Workbook
from lxml import etree

# 1. 实例化
wb = Workbook()
# 2. 激活工作表
ws = wb.active
# 3. 添加表头
ws.append(['阅读','评论','标题','作者','更新时间'])

# 定义请求头
headers = {
    'User-Agent': 自己的用户代理,
}

# 2. 发起请求,接收响应
response = requests.get(url='https://guba.eastmoney.com/',headers=headers)

# etree.HTML()将字符串转换成html元素对象
html = etree.HTML(response.text)

# 提取数据
li_list = html.xpath('//ul[@class="newlist"]/li')

# 循环获取,每一条数据
for li in li_list:
    # 获取阅读数
    read = li.xpath('./cite[1]/text()')[0].strip()
    # 获取评论数
    comment = li.xpath('./cite[2]/text()')[0].strip()
    # 获取标题
    title = li.xpath('./span[@class="sub"]/a/@title')[0]
    # 获取作者
    author = li.xpath('./cite[@class="aut"]/a/font/text()')[0]
    # 获取更新时间
    time = li.xpath('./cite[@class="last"]/text()')[0]
    print(read,comment,title,author,time)
    
3.网易云所有的歌手名字(函数编写)

# 需求:
# 获取每一个大分类下的每一个子分类下的所有歌手名


# 思路:
# 1. 获取大分类的URL,并请求
# 2. 获取小分类的URL,并请求
# 3. 获取歌手名

import requests
from lxml import etree

# 定义请求函数
def get_requests(url):
    response = requests.get(url=url,headers=headers)
    return etree.HTML(response.text)

# 定义获取完整链接的函数
def get_full_href(url):
    return 'https://music.163.com' + url

# 定义获取大分类url的函数
def get_big_type(url):
    # 发起请求,接收响应
    # response = requests.get(url=url,headers=headers)
    # 转换成HTML元素对象
    html = get_requests(url)
    # 获取大分类的URL
    big_type_list = html.xpath('//div[@class="blk"]/ul/li')
    for big_type in big_type_list:
        # 获取大标题链接
        big_href = big_type.xpath('./a/@href')[0]
        # 需要拼接成完整的链接
        big_href_full = get_full_href(big_href)
        get_small_type(big_href_full)
        # print(big_href_full)
    pass

# 定义获取小分类URL的函数
def get_small_type(big_href_full):
    html = get_requests(big_href_full)
    # 获取每一个小分类
    small_li_list = html.xpath('//ul[@id="initial-selector"]/li')
    for small_li in small_li_list:
        # 获取小分类名字
        small_name = small_li.xpath('./a/text()')[0]
        # 获取小分类的链接
        small_href = small_li.xpath('./a/@href')[0]
        small_full_href = get_full_href(small_href)
        # print(small_full_href)
        get_singer(small_name,small_full_href)
        ...
# 定义获取歌手的函数
def get_singer(small_name,small_full_href):
    html = get_requests(small_full_href)
    # 获取歌手名
    # 前五个://ul[@id="m-artist-box"]/li/p/a/text()
    # 中间五个://ul[@id="m-artist-box"]/li[@class="line"]/p/a/text()
    # 其它://ul[@id="m-artist-box"]/li[@class="sml"]/a/text()
    # 最终得到:
    # //ul[@id="m-artist-box"]/li//a/text()
    singer = html.xpath('//ul[@id="m-artist-box"]/li//a/text()')
    # 保存数据
    write_to_txt(small_name,singer)
    # print(singer)
    ...

# 定义保存数据函数
def write_to_txt(small_name,singer):
    dic = {}
    dic['小标题'] = small_name
    dic['歌手'] = singer
    with open('网易云歌手.txt','a',encoding='utf-8') as fp:
        fp.write(str(dic)+'\n')


if __name__ == '__main__':
    # 定义基础URL
    base_url = 'https://music.163.com/discover/artist'
    # 定义请求头
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
    }
    get_big_type(base_url)
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值