1)安装xpath插件
2)在chrome中安装xpath插件
3)将xpath拖入即可
4)验证xpath
1》点击 ctrl + shift + x 出现小黑框,即代表安装成功
2》再次点击 ctrl + shift + x 即可关闭小黑框
1)安装 lxml 库
2)导入 lxml.etree
3)解析 html 文件
- # xpath解析
- (1)本地文件 etree.parse
- (2)服务器响应的数据 response.read().decode('utf8') etree.HTML()
4)获取特定组件内容
tree.xpath('xpath路径')
1、路径查询
//:查找所有子孙节点,不考虑层级关系
/:找直接子节点
2、谓词查询
//div[@id]
//div[@id="maincontent"]
3、属性查询
//@class
4、模糊查询
//div[contains(@id, "he")]
//div[starts-with(@id, "he")]
5、内容查询
//div/h1/text()
6、逻辑运算
//div[@id="head" and @class="s_down"]
//title | //price
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8"/>
- <title>Titletitle>
- head>
- <body>
- <ul>
- <li id="l1" class="c1">北京li>
- <li id="l2">上海li>
- <li>深圳li>
- <li>武汉li>
- ul>
-
- <ul>
- <li>大连li>
- <li>锦州li>
- <li>沈阳li>
- ul>
- body>
- html>
- from lxml import etree
-
- # xpath解析
- # (1)本地文件 etree.parse
- # (2)服务器响应的数据 response.read().decode('utf8') etree.HTML()
-
- # xpath解析本地文件
- tree = etree.parse("17_xpath基本使用.html")
-
- # tree.xpath('xpath路径')
-
- # 查找ul下面的li
- li_list= tree.xpath('//body//ul/li')
-
- # 查找所有有id属性的li标签
- # text()获取标签中的内容
- li_list1 = tree.xpath('//ul/li[@id]/text()')
-
- # 查找id为l1的li标签,注意“引号”的问题
- li_list2 = tree.xpath('//ul/li[@id="l1"]/text()')
-
- # 查找到id为l1的li标签的class的属性值
- li1 = tree.xpath('//ul/li[@id="l1"]/@class')
-
- # 查询id中包含l的li标签
- li2 = tree.xpath('//ul/li[contains(@id,"l")]/text()')
-
- # 查询id的值以l开头的li标签
- li3 = tree.xpath('//ul/li[starts-with(@id,"l")]/text()')
-
- # 查询id为l1和class为c1的标签
- li4 = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
-
- # 查询id为l1或id为l2的标签(只能通过标签获取而不是属性)
- li = tree.xpath('//ul/li[@id="l1"]/text() | //ul/li[@id="l2"]/text()')
-
- # 判断列表的长度
- print(li)
- print(len(li))
1)根据网页源码,编写xpath路径
2)编写代码
- from lxml import etree
- import urllib.request
-
- # (1)获取网页源码
- # (2)解析服务器响应的数据 response.read().decode('utf8') etree.HTML()
- # (3)打印
-
- url = "https://www.baidu.com/"
-
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
- }
-
- # 请求对象的定制
- request = urllib.request.Request(url=url, headers=headers)
-
- # 模拟浏览器访问服务器
- response = urllib.request.urlopen(request)
-
- # 获取网页源码
- content = response.read().decode("utf8")
-
- # 解析网页源码,获取想要的数据
- tree = etree.HTML(content)
-
- # 获取想要的数据 xpath的返回值是一个列表类型的数据
- result = tree.xpath('//input[@id="su"]/@value')[0]
-
- print(result)
爬取到的html可能和浏览器解析的html不一样,故存在浏览器xpath_helper可以获取到,而代码获取不到的情况,需要查看爬取到的源码: