当前位置: 首页 > news >正文

Python爬虫基础——XPath表达式

        首先说一下这节内容在学习过程中存在的问题吧,在爬取百度网页文字时,出现了问题,就是通过表达式在网页搜索中可以定位,但是通过代码无法定位,请教了一位老师,他说是动态链接,目前这部分内容比较陌生,还没有学习到,因此过一段时间在进行补充验证。我一般在学习时都是通过复现作者所写的代码,然后在进行扩展,最后结合网上的思路编写一个想读复杂的案例。

1、实例化etree对象

1.1 etree.parse('HTML文档路径') 使用patse()函数对etree进行实例化(已经验证)

1.2 etree.HTML('网页源码') 使用patse()函数对etree进行实例化(已经验证)

2、用XPath表达式定位标签并提取数据(动态参数存在问题,爬取静态类没有问题)参考文中代码

2.1 定位标签 2.1.1 标签名定位

2.1.2 索引定位

2.1.3 属性定位

2.1.4 逻辑也能算定位

2.2 提取文本内容和属性值

3、快速获取标签节点的Xpath表达式(已经验证)

##############################
##作者:白雪公主的后妈
##时间:2024年1月6日
##主题:Python爬虫基础——Xpath表达式
##主要内容:学习BeaytifulSoup对象中的lxml模块中的etree类,即etree类可以将网页源码实例化为一个etree对象,并shiyongXpanth表达式进行标签定位
###############################1、实例化etree对象
#要使用Xpanth表达式进行数据解析,首先需要实例化一个etree对象,具体方法有两种
#1.1    etree.parse('HTML文档路径')     使用patse()函数对etree进行实例化
# from lxml import etree
# html = etree.parse('text1.html')        #将HTML文档加载到etree类中,实例化成为一个名为html的etree对象
# #1.2    etree.HTML('网页源码')     使用patse()函数对etree进行实例化
# from lxml import etree
# import requests
# #身份码伪装
# header = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36 Edg/131.0.0.0"}        #浏览器身份验证
# #请求的地址
# url = "https://www.baidu.com"
# #发起请求,并获得网页源代码
# response = requests.get(url,headers=header).text
# html = etree.HTML(response)        #将网页源码加载到etree类中,实例化成为一个名为html的etree对象#2、用XPath表达式定位标签并提取数据
#完成etree对象实例化后,可以使用XPath表达式定位标签并提取数据了
#2.1 定位标签
#2.1.1 标签名定位
'''
假设要定位<ul>标签下的所有<li>标签节点,在途中从上往下依次是<html>标签节点——><div>标签节点2——>
<ul>标签节点2——><li>标签节点1、<li>标签节点2。注意用“/”表示一个层次,用“//”表示多个层次,因此,
上述路径XPath可以表示为“/html/body/div[1]/ul/il”。如果不加分区的定义所有的<li>标签,也可以用"//"。
'''
#2.1.2 索引定位
'''
etree对象的每一个层阶都是一个包含所有标签节点的列表,如果同一层级中有多个同名的标签节点,
使用列表切片就能定位到所需的标签节点,即通过索引定位。
'''
#2.1.3 属性定位
'''
在复杂的网页中,每个标签都有其属性,此时可以通过属性进行定位。
'''
import requests
from lxml import etree
#身份码伪装
header = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36 Edg/131.0.0.0"}        #浏览器身份验证
#请求的地址
#url = "https://www.baidu.com"
url = "https://www.hongxiu.com/chapter/30300190804146407/81349808731782632"
#发起请求,并获得网页源代码
response = requests.get(url,headers=header).text
# print(response)
html=etree.HTML(response)     #实例化etree对象
# print(html)print(html.xpath('//*[@id="chapter-81349808731782632"]/div/div[2]/div/p'))
#(html.xpath('//*[@id="hotsearch-content-wrapper"]/text()'))            #?????百度这里是动态链接书上给给到的这个方法有问题
# print(html.xpath('//*[@class="title"'))             #用class属性定位标签
'''
"//"表示多层级,处于Xpath表达式的开头代表从任意层级开始定位;“*”代表任意标签;"[@class="title"代表class属性值为"title"
的任意标签。如果拥有同一个class属性的标签不止一个,可以考虑用id属性值来定位。如果还不能达到目的,可以用其他属性来定位,也
可以将上述XPath表达式中的“*”替换为指定的标签名称,如html.xpath('//p[@class="title"')
'''
#2.1.4 逻辑也能算定位
'''
使用上述方法仍然不能定位,可以配合逻辑运算来进行更精确的定位。
'''
# html.xpath('//p[@class="title" and @name="color"]')
# html.xpath('//p[@class="title" or @name="color"]')
#2.2 提取文本内容和属性值
'''
定位到标签节点后,可在Xpath表达中后面添加“/text”来提取该节点下的所有文本内容,添加“text()”来提取该节点的所有文本内容,
添加“/@属性名”来提取该节点的指定属性值
'''
# html.xpath('//*[@class="title"]/text()')
# html.xpath('//*[@class="title"]//text()')
# html.xpath('//*[@class="title"]/@id')
#3、快速获取标签节点的Xpath表达式
'''
在谷歌浏览器中打开一个网页,然后打开开发者工具,在“Elements”选项卡中的网页源码中邮寄要获取的表达式的标签,
选择copy——>copy xpath即可赋值XPath表达式粘贴到爬虫程序中
'''

http://www.lryc.cn/news/517864.html

相关文章:

  • ansible-性能优化
  • 高等数学学习笔记 ☞ 一元函数微分的基础知识
  • 前后端实现防抖节流实现
  • 【笔记】算法记录
  • 【网络云SRE运维开发】2025第2周-每日【2025/01/08】小测-【第8章 STP生成树协议】理论和实操解析
  • git push -f 指定分支
  • CTF知识点总结(二)
  • 解决Edge打开PDF总是没有焦点
  • 69.基于SpringBoot + Vue实现的前后端分离-家乡特色推荐系统(项目 + 论文PPT)
  • 计算机视觉目标检测-DETR网络
  • 《自动驾驶与机器人中的SLAM技术》ch1:自动驾驶
  • 【UE5 C++课程系列笔记】23——多线程基础——AsyncTask
  • 基于Python的音乐播放器 毕业设计-附源码73733
  • cursor vip
  • Docker部署项目,Mysql数据库总是宕机并且上传数据全部被删除了
  • C++ 复习总结记录六
  • spring boot 集成 knife4j
  • WordPress静态缓存插件WP Super Cache与 WP Fastest Cache
  • Pytest钩子函数,测试框架动态切换测试环境
  • VUE3封装一个Hook
  • 【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程
  • HTML基础入门——简单网页页面
  • INT301 Bio Computation 题型整理
  • 机器学习免费使用的数据集及网站链接
  • 低空经济——飞行汽车运营建模求解问题思路
  • 英伟达Project Digits赋能医疗大模型:创新应用与未来展望
  • 【Python3】异步操作 redis
  • 【W800】UART 的使用与问题
  • UART串口数据分析
  • NFS 组件容器化部署实战指南