数据提取_1

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))
相关推荐
七夜zippoe6 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥6 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
Fcy6487 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满8 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠8 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥8 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey9038 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技9 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀9 小时前
Linux环境变量
linux·运维·服务器
zzzsde9 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器