xpath
xml,是一种数据格式,和json的位置一样,前后端交互,传输数据使用的格式
xml和html的不同:
(1)xml是用来传输和存储数据的,html是用来显示数据的
(2)xml标签可以自定义,html是官方规定好的标签
(3)xml都是纯文本,而html是超文本
xml语法:
(1)必须有关闭标签
(2)标签名对大小写敏感
(3)属性值必须加双引号
xpath:是用来解析xml数据的,和html有啥关系呢?
html和xml都是标记语言,有人搞了一套库,叫做lxml,实现的功能就是用xpath的语法来解析html数据
xpath语法:
// 从任意位置开始查找
. 从当前节点开始查找
.. 从上一级节点开始查找
@ 用来筛选属性的
常见的路径表达式:
bookstore/book 从bookstore下面查找book,book是直接子节点
bookstore//book 从bookstore下面查找所有的book,直接子节点子孙节点都行
//book 从整个文档中查找所有book
//@lang 查找所有的有lang属性节点
bookstore/book[1] 取出第一个直接子节点book
【注】下标从1开始
bookstore/book[last()] 取出最后一个直接子节点book
bookstore/book[last()-1] 取出倒数第二个直接子节点book
bookstore/book[position()<3] 取出前两个直接子节点book
//title[@lang='eng'] 选取所有lang属性值为eng的title节点
bookstore/* bookstore下面所有直接子节点
//* 查找所有节点
//title[@*] 查找有属性的title节点
两个函数
starts-with contains
xpath在html中的应用
(1)属性筛选
//input[@id='kw']
如果属性值多,需要全部复制进去
//div[@class="s_form_wrapper soutu-env-nomac soutu-env-index"]
(2)层级和索引筛选
//div[@id="u1"]/a[3]
(3)取属性和取文本
属性://div[@id="u1"]/a[4]/@href
文本内容://div[@id="u1"]/a[4]/text()
(4)函数
starts-with
属性以某某开头: //div[@id="u1"]/a[starts-with(@class,'m')]
文本以某某开头: //div[@id="u1"]/a[starts-with(text(),'地')]
contains
属性包含某某://div[@id="u1"]/a[contains(@href,'123')]
文本包含某某://div[@id="u1"]/a[contains(text(),'闻')]
代码中使用
from lxml import etree
过程:首先根据etree里面的方法将html格式的字符串搞成一个对象 tree,然后就可以使用tree里面的方法xpath。
本地文件:etree.parse('文件名')
网络文件: etree.HTML('网页字符串')
xpath方法返回的是列表,需要通过下标进行提取
如果标签里面还有子标签,获取使用方式:
ret = tree.xpath('//div[@class="star"]//text()')
然后手动拼接列表即可
ret = tree.xpath('//div[@class="star"]')[0].xpath('string(.)')
直接得到标签里面所有的内容
import requests
from lxml import etree
# 生成tree对象
url = ''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
r = requests.get(url=url, headers=headers)
tree = etree.HTML(r.text)
views = tree.xpath('//input[@id="__VIEWSTATE"]/@value')[0]
viewg = tree.xpath('//input[@id="__VIEWSTATEGENERATOR"]/@value')[0]
xpath
最新推荐文章于 2024-05-02 10:55:42 发布