一.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的区别
- 他们两者都适用于操作数据或者数据结构,在结构上大致相同,但他们的本质上却存在着明显的区别.
数据格式 | 描述 |
---|---|
XML | EXtensible Markup Language 可扩展标记语言,被设计为传输和存储数据,其焦点是数据的内容 |
HTML | HyperText Markup Language 超文本标记语言,显示数据以及如何更好地显示数据 |
HTML DOM | Document 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)