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

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.kler.cn/a/472895.html

相关文章:

  • C++ 11,14,17 新特性
  • 解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。
  • Wi-Fi Direct (P2P)原理及功能介绍
  • 【竞技宝】CS2:HLTV2024职业选手排名TOP8-broky
  • 【银河麒麟高级服务器操作系统实例】tcp半链接数溢出分析及处理全过程
  • 121 买入股票的最佳时机
  • ffmpeg之h264格式转yuv
  • WEBRTC前端播放 播放器组件封装
  • 【Linux】深入理解文件系统(超详细)
  • 自动化执行 SQL 脚本解决方案
  • 十六、Vue 组件
  • 《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(26):数字签名
  • 【数据结构-堆】【二分】力扣3296. 移山所需的最少秒数
  • 牛客网刷题 ——C语言初阶(5操作符)——BC90 矩阵计算
  • 解决word桌面图标空白
  • UTTracker背景矫正模块详解:解决无人机追踪中的摄像头运动问题
  • Ruby语言的正则表达式
  • WebSocket 设计思路
  • 怎样用云手机进行海外社媒矩阵引流?
  • 【Linux】lnav - 适用于Linux和Unix的出色终端日志文件查看器
  • windows从0开始配置llamafactory微调chatglm3-6b
  • 使用vue-pdf预览pdf和解决pdf电子签章显示问题
  • 【中标喜讯分享】泰迪智能科技实力中标长春医学高等专科学校健康大数据管理与服务专业实训软件采购项目
  • 计算机网络——期末复习(7)期末试卷样例3
  • CSS语言的软件工程
  • STM32-DMA数据转运