1. xpath 查找
1.1 xpath介绍:
1.lxml是python的一个解析库,支持HTML和XML,支持XPath解析方式,而且解析效率非常高。
2.XPath,全称XML Path Language ,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。
3.全称为XML Path Language 一种小型的查询语言
4.说到XPth这门语言,不得不说它所具备的优点:
1.可在XML中查找信息
2.支持HTML的查找
3.通过元素和属性进行导航
1.2 xpath常用规则
1 .nodename------>选取此节点的所有子节点
2. /------>从当前节点选取直接子节点
3. //------>从当前节点选取子孙节点
4. . ------>选取当前节点
5. ... ------>选取当前节点的父节点
6. @ ------>选取属性
xpath 操作:
python
#导入lxml模块
from lxml import etree
with open('XpathDemo.html','r',encoding='utf8') as f:
#html可以接收 byte 和字符串连接
#etree.HTML()可以用来解析字符串格式的HTML文档对象
html=etree.HTML(f.read())
# / 从根节点选取节点·
print(html.xpath("/html/head"))
# // 从当前节点选取子孙节点
print(html.xpath("//div"))
print(html.xpath("/html/body//p"))
#xpath 匹配结果为列表
ul=html.xpath("//ul[0]")
# xpath 跟谁调用无关 只跟表达式有关
print(ul.xpath("ul//head"))
# . 选取当前节点
print(ul.xpath("./li"))
# .. 选取当前节点的父节点
print(print(ul.xpath("../p")))
# [index] 根据下标选取节点
print(ul.xpath("./li[3]/p/span/text()"))
# index值 可以为函数 last()结果 表示最后一个
print(ul.xpath("./li[last()]/p/span/text()"))
print(ul.xpath("./li[last()-1]/p/span/text()"))
2. jsonpath使用
| xpath | JSONPath | Description |
|---|---|---|
| / | $ | 表示根元素 |
| . | @ | 当前元素 |
| / | .or [ ] | 子元素 |
| ... | n/a | 父元素 |
| // | ... | 递归下降,JSONpath从E4x借鉴的 |
| * | * | 通配符,表示所有元素 |
| @ | n/a | 属性访问字符 |
| [] | [] | 子元素操作符 |
| | | [,] | 连接操作符在xPath结果合并其他结点集合,JSONP允许name或者数组索引 |
| n/a | [start🔚step] | 数组分割操作从ES4借鉴 |
| [] | ?() | 应用过滤表示式 |
| n/a | () | 脚本表达式,使用在脚本引擎下面 |
| () | n/a | Xpath分组 |
python
from jsonpath import jsonpath
import json
with open("area.json","r",encoding="utf8") as f:
data=json.load(f)
print(data,type(data))
# $ 根元素
# . 子元素
# 获取根元素下content结点的第一个元素
content=jsonpath(data,"$.content")
print(content)
#获取所有id节点值
print(jsonpath(content,"$..id"))
#[] 子元素
print(jsonpath(content,"$.data[0]"))
print(jsonpath(content,"$.data[:2]"))
print(jsonpath(content,"$.data[:-1]"))
print(jsonpath(content,"$.data[(@.length-1)]"))
print(jsonpath(content,"$.data[?(@.code)]"))
# * 通配符 表示所有元素
# 获取data节点下第一个元素的所有节点值
print(jsonpath(content,"$.data[0].*"))
案例:从17k网站提取数据
python
import requests
from jsonpath import jsonpath
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}
#登陆网址
login_url="https://passport.17k.com/ck/user/login"
#书架网址
books_url="https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919"
form_data={
'loginName':'17590967558',
'password':'@z310425'
}
#创建会话
session=requests.session()
login_response=session.post(login_url,headers=headers,data=form_data)
print(login_response.status_code)
print(login_response.cookies)
#获取书架信息
books_response=session.get(books_url,headers=headers)
#获取所有书名和作者名
# print(books_response.json())
print(jsonpath(books_response.json(),"$..))
print(jsonpath(books_response.json(),"$..authorPenName"))
3. 正则查找
- re 是匹配字符串内容的一种规则
- 1.re.compile 正则表达式的语法
- 2.re.search 找一个
- 3.re.match从头找一个 没有返回None
- 4.re.findall 找所有 返回列表
- . ------> 匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
- *------>匹配0个或多个的表达式
- +------>匹配1个或多个的表达式
- ?------>匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
-
\]------\>表示一组字符
- \s------>匹配任何空白字符
- \d------>匹配任何数字
4.csv
4.1 介绍
- csv 文件是大数据文件存储格式的文件 结构与excel不同。
- csv 是一种通用的,相对简单的文件格式,被用户,商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的。
- 因为大量程序都支持某种csv变本,至少是作为一种可选择的输入\输出格式。
- 例如,一个用户可能需要交换信息,从一个以私有格式存储数据的数据库程序,到一个数据格式完全不同的电子表格。最可能的情况是,该数据库程序可以导出数据为"csv",然后被导出的csv文件可以被电子表格程序导入。
案例:
列表------》list
csv文件_写入数据
python
import csv
#定义表头
headers=["book_name","author_name","book_type"]
#列表数据
book_rows_li = [
['网游:开局防御加满,化身移动要塞', '谒始', '游戏竞技'],
['全球废土:我以机械比肩神明', '岐峰', '科幻末世'],
['民间诡梦实录', '王诡一', '都市小说'],
['奶包三岁半,我是全豪门的团宠', '惊颜', '现代言情'],
['万恶的考试和资本', '白日不栽柳', '浪漫青春']
]
with open("ccc/books1.csv", "w", encoding="utf8", newline="") as wf:
#创建一个写入对象
csv_writer=csv.writer(wf)
#写入表头
csv_writer.writerow(headers)
#写入多行数据
csv_writer.writerows(book_rows_li)
css文件_读取数据
python
#读取css文件 以列表格式输出
with open("ccc/books1.csv", "r", encoding="utf8", newline="") as rf:
#创建一个读取(可迭代对象)
reader=csv.reader(rf)
#写入表头
next(reader)
for row in reader:
print(row)
字典------》dict
csv文件_写入数据
python
#写入字典数据到csv文件 --常用方式
with open("ccc/books2.csv", "w", encoding="utf8", newline="") as wf:
#创建写入对象 需要传递表头 目的:确定数据写入位置
writer=csv.DictWriter(wf,headers)
#写入表头
writer.writeheader()
#写入多行数据
writer.writerows(book_rows_li)
css文件_读取数据
python
#读取字典数据到csv文件 --常用方式
with open("ccc/books2.csv", "r", encoding="utf8", newline="") as rf:
#创建写入对象 需要传递表头 目的:确定数据写入位置
reader = csv.DictReader(wf,headers)
#写入表头
next(reader)
for row in reader:
print(row)
案例------爬取壁纸
python
import re
import requests_html
session = requests_html.HTMLSession()
url = 'http://www.netbian.com/'
response = session.get(url)
#设置网页解析的编码模式(根据网页编码确定)
response.encoding = "gbk"
html = response.text
#编译正则表达式 re.s 设置,匹配换行 re.I 设置匹配对大小写不敏感
pattern = re.compile(r'<img src="(.*?)".*?>',re.S|re.I)
print(pattern.findall(html))