尚硅谷爬虫(解析_xpath的基本使用)笔记

news2024/12/21 22:26:17

1、xpath的基本使用

创建一个简单的HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 <ul>
     <li>北京</li>
     <li>上海</li>
     <li>深圳</li>
     <li>武汉</li>
 </ul>
<ul>
    <li>大连</li>
    <li>锦州</li>
    <li>沈阳</li>
</ul>
</body>
</html>

创建一个python文件:

如果解析本地文件使用etree.parse

如果解析服务器响应文件使用etree.HTML()

from lxml import etree
# xpath解析
# (1)本地文件                                                      etree.parse
# (2)服务器的响应数据 response.read().decode('utf-8')******* 应用较多 etree.HTML()

tree=etree.parse('shangguigu.html')
print(tree)



运行:

 会报错

lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 4 and head, line 6, column 8

原因是 xpath 严格遵守HTML规范  

解决方法:

在meta标签中加入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
 <ul>
     <li>北京</li>
     <li>上海</li>
     <li>深圳</li>
     <li>武汉</li>
 </ul>
<ul>
    <li>大连</li>
    <li>锦州</li>
    <li>沈阳</li>
</ul>
</body>
</html>

再次运行:

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

# 查找ul下面的li

from lxml import etree
# xpath解析
# (1)本地文件                                                      etree.parse
# (2)服务器的响应数据 response.read().decode('utf-8')******* 应用较多 etree.HTML()

tree=etree.parse('shangguigu.html')
print(tree)

# tree.xpath('xpath路径')

# 查找ul下面的li
li_list=tree.xpath('//body/ul/li')
# 判断列表的长度
print(li_list)
print(len(li_list))

# 查早所有id的属性的li标签

HTML中添加分别在北京和上海中添加 id='1'  id='2'

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
 <ul>
     <li id="1">北京</li>
     <li id="2">上海</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('utf-8')******* 应用较多 etree.HTML()

tree=etree.parse('shangguigu.html')
print(tree)

# tree.xpath('xpath路径')

# # 查找ul下面的li
# li_list=tree.xpath('//body/ul/li')
# # 判断列表的长度
# print(li_list)
# print(len(li_list))

# 查早所有id的属性的li标签
li_list=tree.xpath('//ul/li[@id]')
print(li_list)
print(len(li_list))

# text()获取标签中的内容

from lxml import etree
# xpath解析
# (1)本地文件                                                      etree.parse
# (2)服务器的响应数据 response.read().decode('utf-8')******* 应用较多 etree.HTML()

tree=etree.parse('shangguigu.html')
print(tree)

# tree.xpath('xpath路径')

# # 查找ul下面的li
# li_list=tree.xpath('//body/ul/li')
# # 判断列表的长度
# print(li_list)
# print(len(li_list))

# 查早所有id的属性的li标签
# text()获取标签中的内容
li_list=tree.xpath('//ul/li[@id]/text()')
print(li_list)
print(len(li_list))

# 找到id为l1的标签

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
 <ul>
     <li id="l1">北京</li>
     <li id="2">上海</li>
     <li>深圳</li>
     <li>武汉</li>
 </ul>
<!--<ul>-->
<!--    <li>大连</li>-->
<!--    <li>锦州</li>-->
<!--    <li>沈阳</li>-->
<!--</ul>-->
</body>
</html>

Python:

from lxml import etree
# xpath解析
# (1)本地文件                                                      etree.parse
# (2)服务器的响应数据 response.read().decode('utf-8')******* 应用较多 etree.HTML()

tree=etree.parse('shangguigu.html')
print(tree)

# tree.xpath('xpath路径')

# # 查找ul下面的li
# li_list=tree.xpath('//body/ul/li')
# # 判断列表的长度
# print(li_list)
# print(len(li_list))

# 查早所有id的属性的li标签
# text()获取标签中的内容
# li_list=tree.xpath('//ul/li[@id]/text()')

# 找到id为l1的标签
li_list=tree.xpath('//ul/li[@id="l1"]/text()')
print(li_list)
print(len(li_list))

 HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
 <ul>
     <li id="l1" class="c1">北京</li>
     <li id="2">上海</li>
     <li>深圳</li>
     <li>武汉</li>
 </ul>
<!--<ul>-->
<!--    <li>大连</li>-->
<!--    <li>锦州</li>-->
<!--    <li>沈阳</li>-->
<!--</ul>-->
</body>
</html>

Python:

from lxml import etree
# xpath解析
# (1)本地文件                                                      etree.parse
# (2)服务器的响应数据 response.read().decode('utf-8')******* 应用较多 etree.HTML()

tree=etree.parse('shangguigu.html')
print(tree)

# tree.xpath('xpath路径')

# # 查找ul下面的li
# li_list=tree.xpath('//body/ul/li')
# # 判断列表的长度
# print(li_list)
# print(len(li_list))

# 查早所有id的属性的li标签
# text()获取标签中的内容
# li_list=tree.xpath('//ul/li[@id]/text()')

# 找到id为l1的标签
# li_list=tree.xpath('//ul/li[@id="l1"]/text()')

# 查找到id为l1的li标签的class的属性值
li_list=tree.xpath('//ul/li[@id="l1"]/@class')
print(li_list)
print(len(li_list))

 2、获取百度网站的百度一下

定位:

右键——检查——点击左上角小箭头——点击百度一下  即可快速定位 

右键定位后的代码——Copy——Copy xPath  

# 1 获取网页源码
# 2 解析 解析的服务器响应的文件 etree.HTML
# 3 打印

import urllib.request

url='https://www.baidu.com/'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}

# 请求对象的定制
request =urllib.request.Request(url=url,headers=headers)

#模拟浏览器访问服务器
response =urllib.request.urlopen(request)

#获取网页源码
content=response.read().decode('utf-8')

# print(content)
# 解析网页源码 来获取我们想要的数据
from lxml import etree

#解析服务器响应的文件
tree=etree.HTML(content)

# 获取想要的数据 xpath默认返回一个列表
result=tree.xpath('//input[@id="su"]/@value')[0]

print(result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题(Java),数字涂色(100%通过+复盘思路)

一、题目描述 疫情过后&#xff0c;希望小学终于又重新开学了&#xff0c;三年二班开学第一天的任务是将后面的黑板报重新制作。 黑板上已经写上了N个正整数&#xff0c;同学们需要给这每个数分别上一种颜色。 为了让黑板报既美观又有学习意义&#xff0c;老师要求同种颜色的…

网络编程与select/poll/epoll服务器的实现

目录 什么是网络编程&#xff1f;网络编程效果演示阻塞与非阻塞的区别阻塞状态一个server对应一个client运行结果连接之前点击连接之后&#xff0c;并发送信息 非阻塞状态一个server对应一个client运行结果 为什么要使用while循环来反复读取数据运行结果运行之前连接之后server…

“老司机”机器视觉工程师警告,硬件,软件,固件,程序使用新版本务必谨慎

做任何事情之前&#xff0c;程序先保存。没保存&#xff0c;真的会哭的。千万别保存在系统盘。​ 机器视觉最终的目的解决是什么问题&#xff1f;项目验收结束。 如果公司不知道或者希望去测试新的东西&#xff0c;要积极主动去使用&#xff0c;也会学到很多新的东西&#xff…

苦中作乐 ---竞赛刷题71-88(15-20) 完结篇

&#xff08;一&#xff09;目录 L1-071 前世档案 L1-072 刮刮彩票 L1-077 大笨钟的心情 L1-078 吉老师的回归 L1-079 天梯赛的善良 L1-080 乘法口诀数列 L1-085 试试手气 L1-086 斯德哥尔摩火车上的题 L1-087 机工士姆斯塔迪奥 L1-088 静静的推荐 &#xff08;二&…

Java核心技术 卷1-总结-16

Java核心技术 卷1-总结-16 线程属性线程优先级守护线程未捕获异常处理器 同步竞争条件的一个例子竞争条件详解锁对象 线程属性 线程的各种属性包括&#xff1a;线程优先级、守护线程、线程组以及处理未捕获异常的处理器。 线程优先级 在Java程序设计语言中&#xff0c;每一个…

STM32中断详述——外部EXTI

前置知识 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断源&#xff0c;使得CPU暂停当前正在运行中的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续执行&#xff0c;可以参考图1所示。 图1 中断程序图 中断优先级&a…

法雷奥,百年巨头的新周期

传统汽车零部件Tier1正在加速适应全球智能化、电动化的汽车产业新变革趋势。同时&#xff0c;继续扩大在中国市场的投资&#xff0c;并强化本土化研发能力和资源投入&#xff0c;已经是大势所趋。 “2022年&#xff0c;法雷奥启动了’Move Up’计划&#xff0c;确定了四个符合市…

PC1 - 搭建项目

先看路由&#xff0c;可以查看功能模块划分。熟悉什么看什么 router文件夹下routerConfig.tsx 配置路由&#xff0c;创建模块文件&#xff08;写好内容模块&#xff09;&#xff0c;lazy可懒加载导入。App.tsx配置一级路由&#xff0c;配置二级路由出口 { path:/, element: …

PTA L2-046 天梯赛的赛场安排 (25 分)

天梯赛使用 OMS 监考系统&#xff0c;需要将参赛队员安排到系统中的虚拟赛场里&#xff0c;并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们&#xff0c;以便发放比赛账号。为了尽可能减少教练和监考的沟通负担&#xff0c;我们要求赛场的安排满…

「教程」天气预警 API 详解:申请密钥到接入代码一气呵成!

引言 天气预警 API 作为一种新型的数据接口&#xff0c;为开发者和应用提供了方便的获取天气预警数据的方式。通过该 API &#xff0c;可以获取指定城市当前生效中的各类天气预警信息&#xff0c;例如暴雨、雷电、台风等。预警数据来自国家预警中心&#xff0c;保证了数据的高…

Linux部署人大金仓(Kingbase8)

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-人大金仓&#xff08;kingbase8&#xff09;&#xff08;主要讲一些人大金仓数据库相关的内容&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下LInux上部署人大…

《计算机网络——自顶向下方法》精炼——2.3-2.4

<font color-#FFD700>“Knowledge is power” - Sir Francis Bacon 文件传输协议&#xff1a;FTP FTP协议可以在本地文件系统和远程文件系统之间传输文件。 概述 FTP在用户和服务器之间架起两条TCP连接&#xff0c;控制连接和数据连接。 控制连接&#xff1a;控制连…

[BJDCTF2020CTF]之CTFHub-Misc篇刷题记录(完结)

CTFHub-Misc篇刷题记录①wp SUCTF-2019-MISC签到题RCTF-2019-Misc-draw2020-BJDCTF-Misc-藏藏藏2020-BJDCTF-Misc-签个到2020-BJDCTF-Misc-认真你就输了2020-BJDCTF-Misc-你猜我是个啥2020-BJDCTF-Misc-一叶障目2020-BJDCTF-Misc-鸡你太美2020-BJDCTF-Misc-just a rar[BJDCTF20…

Linux下搭建Go开发环境

Linux下搭建Go开发环境可以按照以下步骤进行&#xff1a; 1、下载最新的Go语言二进制包&#xff0c;可以从官网 https://golang.org/dl/ 下载。 2、将下载好的包解压缩到你想要安装的目录下&#xff0c;如 /usr/local/go。 3、添加环境变量&#xff0c;在终端中输入以下命令…

Matplotlib 绘图标记

Matplotlib 绘图标记 绘图过程如果我们想要给坐标自定义一些不一样的标记&#xff0c;就可以使用 plot() 方法的 marker 参数来定义。 以下实例定义了实心圆标记&#xff1a; 实例 import matplotlib.pyplot as plt import numpy as npypoints np.array([1,3,4,5,8,9,6,1,3…

【信息安全】一文读懂 “3保1评” 等保、分保、关保、密评

【前言】 信息安全知识大而杂&#xff0c;网上资料参差不齐&#xff0c;相关概念模糊不清&#xff0c;所以想归纳一些知识点&#xff0c;与各位共勉。 本篇博文介绍国内安全领域常见的“3保1评”&#xff0c;即等保&#xff08;网络安全等级保护&#xff09;、分保&#xff08;…

[ Java SE] 对象的比较

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Postgres逻辑复制详解

逻辑复制 逻辑复制&#xff08;Logical Replication&#xff09;&#xff0c;是一种根据数据对象的 复制标识&#xff08;Replica Identity&#xff09;&#xff08;通常是主键&#xff09;复制数据对象及其变化的方法。 逻辑复制 这个术语与 物理复制相对应&#xff0c;物理…

不得不说的结构型模式-适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;是结构型模式之一&#xff0c;它将一个类的接口转换成客户希望的另一个接口&#xff0c;从而使原本由于接口不兼容而不能一起工作的类能够协同工作。适配器模式包括对象适配器和类适配器两种实现方式。 在对象适配器中&#…

Ae 入门系列之十:效果和动画预设

Ae 中提供了丰富的效果 Effects和动画预设 Animation Presets&#xff0c;可以轻松、快速地创建出各种酷炫的动画。 ◆ ◆ ◆ 效果 添加效果 方法一&#xff1a;先选中一个或多个图层&#xff0c;然后在Ae菜单&#xff1a;效果 Effect中找到并添加需要的效果。 方法二&#x…