开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情
简介
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
另外,XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。
XPath使用:
XPath准备
注意:浏览器提前安装xpath插件
如果使用的是谷歌浏览器,可以安装XPath Helper,它可以在显示xpath路径对应的元素。
输入搜索框的路径,它可以直接显示出元素的位置。
1.安装lxml库
pip install lxml -i pypi.douban.com/simple
2.导入lxml.etree
from lxml import etree
3. etree.parse()解析本地文件
html_ tree = etree . parse( 'xx.html')
4.etree.HTML()服务器响应文件
html_ tree = etree.HTML(response.read().decode('utf-8')
4.解析xpath路径
html_ tree.xpath(xpath路径)
XPath基本语法
xpath基本语法:
| 语法 | 作用 |
|---|---|
// | 查找所有子孙节点,不考虑层级关系; |
/ | 找直接子节点 |
@ | 选取元素 |
. | 选取当前节点 |
. . | 选取当前节点的父节点 |
查找案例
-
查找ul下面的li:
li_list = tree.xpath('//body/ul/li') -
查找id为wk的div:
li_list = tree.xpath('//div[@id="wk"]') -
查找所有有id属性的li标签:
li_list = tree.xpath('//ul/li[@id]/text()') text():获取标签内容 -
找到id为l1的id的li标签:
li_list = tree.xpath('//ul/li[@id="l1"]/text()') -
查找到id为l1标签的class属性值:
li_list = tree.xpath('//ul/li[@id="l1"]/@class') -
查询id中包含l的li标签:
li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()') -
查询id的值以l开头的li标签:
li_list = tree.xpath('//ul/li[starts-with(@id,"l")]/text()')
实战案例:
import urllib.request
import urllib.parse
import random
# import lxml.html
# etree = lxml.html.etree
from lxml import etree
url = "https://www.baidu.com/";
Agent = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
# 1.请求对象的定制
request = urllib.request.Request(url=url, headers=Agent)
# 2.获取响应的数据
response = urllib.request.urlopen(request);
content = response.read().decode('utf-8')
# 解析网页源码
tree = etree.HTML(content)
result = tree.xpath('//input[@id="su"]/@value')
print(result)
# 下载数据到本地
# with open('douban.json','w',encoding='utf-8') as fp:
# fp.write(content)